1

画面の前半に写真を表示する水平UIScrollViewを使用しています。(CGRect(0,0,320,120)を想像してください。最初のscrollViewは2番目のscrollviewに埋め込まれ、すべての画面が表示されます。ページを下にスクロールすると(つまり、2番目のscrollView)、最初のscrollviewのアニメーションが停止します。NSTimerをプログラムしました。最初のUIScrollViewで3秒ごとに写真を変更しますが、2番目のscrollViewをスクロールしている間、アニメーションがキューに入れられているようです。画面の指を離すと、写真の遷移がほとんどありません(つまり、次の場合は2つの変更) 6秒間停止せずにスクロールしました)。要するに、2番目のscrollViewをスクロールしている間、ブロック(または他の何か)を使用してアニメーションを続行するにはどうすればよいですか?

私のNSTimer(viewDidLoad内):

timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(changePage:) userInfo:nil repeats:YES];
4

1 に答える 1

1

iOSアプリには、ユーザー入力などを継続的にチェックする実行ループがあります。タッチイベントの検出でビジー状態の場合、その実行ループでスケジュールされていることは実行されません。(同様に、たとえば大きなサーバー要求でメインスレッドをブロックすると、その間はタッチイベントが発生しません)。

NSTimerを正しい実行ループで取得する方法は次のとおりです。

まず、timerWithTimeInterval:target:selector:userInfo:repeats:実行ループでスケジュールされていないタイマーを作成するために使用します。次に、を使用- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)modeして、実行ループでタイマーをスケジュールします。mode引数(実行ループタイプ)の場合、を使用NSRunLoopCommonModesして、メインの実行ループを待機せずにタイマーを起動できるようにします。

これと同じ効果が、たとえばperformSelectorAfterDelayメイン実行ループで実行された場合にも存在することに注意してください。アニメーション完了ブロックにも適用されます。CoreAnimationを使用する以外に、アニメーション完了ブロックの問題を回避する簡単な方法があるかどうかはわかりません。

于 2012-10-18T03:17:48.623 に答える