假設我有一個UIView
的子類,我將調用AnimatableView
,其中我的layoutSubviews
的實現部署了一些內部內容。調用layoutSubviews之前將在UIView上運行的NSOperation
AnimatableView
也有方法commenceAnimationLoop
這看起來是這樣的:
- (void) commenceAnimationLoop {
NSOperation *animationLoop = [[AnimationLoopOperation alloc]init];
[queue addOperation:animationLoop]; //queue is a NSOperationQueue iVar of AnimatableView
[animationLoop release];
}
的AnimationLoopOperation
是其main
方法將啓動無限動畫只有一次isCancelled
財產變成YES
退出的NSOperation
一個子類。
我遇到的問題是在我的ViewController
,我的設置和動畫的AnimatableView
一個實例,像這樣:
- (void) viewDidLoad {
AnimatableView *animatableView = [AnimatableView alloc]initWithFrame:someFrame];
[self.view addSubview: animatableView];
[animatableView commenceAnimationLoop];
[animatableView release];
}
的問題是,在commenceAnimationLoop
創建NSOperation
執行我的AnimatableView
實例已收到機會致電layoutSubviews
(這意味着它的內容尚未生成和佈局)。
我想提出一個受過教育的猜測,layoutSubviews
方法後來被稱爲(當ViewController
準備呈現其視圖層次?),但該方法commenceAnimationLoop
產生一個線程立即在後臺執行。
總結 - 在開始之前,什麼纔是使我的animationLoop
操作等待視圖佈局的最佳方式?
爲我想要實現的目標提供一些高級環境 - 我正在使用NSOperation
開始連續動畫。我的想法是,我可以提供一個endAnimation
方法,可能會在我的隊列上調用cancelAllOperations
。所有這些都是希望我能夠提供一種啓動方式,然後用兩種方法commenceAnimationLoop
和endAnimation
中斷無限動畫。也許我正在吠叫走多線程路線的錯誤樹?
如果您需要layoutSubviews在您的操作之前運行,那麼您不應該啓動操作隊列(使用'setSuspended:YES'),直到它完成。你可以在'viewDidAppear'中啓動操作隊列('setSuspended:NO')... –
上面的工作,它也是一個非常簡單的解決方案。添加它作爲答案,我會接受它。 – Barjavel