UIView
を呼び出すサブクラスがあるとしますAnimatableView
。ここで、 の実装layoutSubviews
によって内部コンテンツがレイアウトされます。
AnimatableView
commenceAnimationLoop
次のようなメソッドもあります。
- (void) commenceAnimationLoop {
NSOperation *animationLoop = [[AnimationLoopOperation alloc]init];
[queue addOperation:animationLoop]; //queue is a NSOperationQueue iVar of AnimatableView
[animationLoop release];
}
はのAnimationLoopOperation
サブクラスでNSOperation
あり、プロパティが になるとmain
終了する無限アニメーションを開始するメソッドを持っています。isCancelled
YES
私が抱えている問題は、次のようなViewController
インスタンスをセットアップしてアニメーション化する場所にあります。AnimatableView
- (void) viewDidLoad {
AnimatableView *animatableView = [AnimatableView alloc]initWithFrame:someFrame];
[self.view addSubview: animatableView];
[animatableView commenceAnimationLoop];
[animatableView release];
}
問題は、私のインスタンスが呼び出される前にNSOperation
作成されたが実行されることです(つまり、コンテンツがまだ生成およびレイアウトされていないことを意味します)。commenceAnimationLoop
AnimatableView
layoutSubviews
私は、layoutSubviews
メソッドが後で呼び出される (ViewController
ビュー階層をレンダリングする準備ができたとき?) という経験に基づいた推測をしていますが、commenceAnimationLoop
メソッドはバックグラウンドですぐに実行されるスレッドを生成します。
animationLoop
要約すると、操作を開始する前にビューがレイアウトされるのを待つ最良の方法は何ですか?
私が達成しようとしていることの高レベルのコンテキストを提供するためにNSOperation
、連続アニメーションを開始するために使用しています。私のキューでendAnimation
呼び出す可能性が高いメソッドを提供できるという考えです。これはすべて、 と の 2 つのメソッドをcancelAllOperations
使用して、無限アニメーションを開始してから中断する方法を提供できることを期待して行われます。おそらく、マルチスレッドのルートをたどる間違ったツリーを吠えているのでしょうか?commenceAnimationLoop
endAnimation