0

UIViewを呼び出すサブクラスがあるとしますAnimatableView。ここで、 の実装layoutSubviewsによって内部コンテンツがレイアウトされます。

AnimatableViewcommenceAnimationLoop次のようなメソッドもあります。

- (void) commenceAnimationLoop {

    NSOperation *animationLoop = [[AnimationLoopOperation alloc]init];
    [queue addOperation:animationLoop]; //queue is a NSOperationQueue iVar of AnimatableView
    [animationLoop release];
}

はのAnimationLoopOperationサブクラスでNSOperationあり、プロパティが になるとmain終了する無限アニメーションを開始するメソッドを持っています。isCancelledYES

私が抱えている問題は、次のようなViewControllerインスタンスをセットアップしてアニメーション化する場所にあります。AnimatableView

- (void) viewDidLoad {
    AnimatableView *animatableView = [AnimatableView alloc]initWithFrame:someFrame];

    [self.view addSubview: animatableView];
    [animatableView commenceAnimationLoop];

    [animatableView release];
}

問題は、私のインスタンスが呼び出される前にNSOperation作成されたが実行されることです(つまり、コンテンツがまだ生成およびレイアウトされていないことを意味します)。commenceAnimationLoopAnimatableViewlayoutSubviews

私は、layoutSubviewsメソッドが後で呼び出される (ViewControllerビュー階層をレンダリングする準備ができたとき?) という経験に基づいた推測をしていますが、commenceAnimationLoopメソッドはバックグラウンドですぐに実行されるスレッドを生成します。

animationLoop要約すると、操作を開始する前にビューがレイアウトされるのを待つ最良の方法は何ですか?

私が達成しようとしていることの高レベルのコンテキストを提供するためにNSOperation、連続アニメーションを開始するために使用しています。私のキューでendAnimation呼び出す可能性が高いメソッドを提供できるという考えです。これはすべて、 と の 2 つのメソッドをcancelAllOperations使用して、無限アニメーションを開始してから中断する方法を提供できることを期待して行われます。おそらく、マルチスレッドのルートをたどる間違ったツリーを吠えているのでしょうか?commenceAnimationLoopendAnimation

4

1 に答える 1

2

操作の前に実行する必要がある場合はlayoutSubviews、その前に操作キューを開始しないでください。を使用して、操作キューが追加の操作を開始するのを防ぐことができます[myOperationQueue setSuspended:YES];

キューが新しい操作を開始するのを防ぐだけなので、操作を追加する前にキューを一時停止する必要があります。

ビューをロードしlayoutSubviewsて実行したら、 を使用して操作キューを再開できます[myOperationQueue setSuspended:NO];。これを行う場所の 1 つはviewDidAppear.

于 2012-05-25T07:21:24.910 に答える