0

NSTimer によって起動されたメイン ウィンドウに OpenGL アニメーションを描画しています。スクロール可能な UITableView メニューを含むポップオーバー ウィンドウを表示すると、スクロール中にアニメーションがフリーズします。スクロール アニメーションが停止すると、タイマー コールバックが再び開始されます。メイン ウィンドウの更新が停止するのは、ユーザーが積極的にスクロールしようとしたときだけです。

Apple のスクロール アニメーションが何らかの形でメイン ループのディスパッチをブロックしているようです。これは本当ですか、それを修正する方法はありますか?

コードの複雑さが指数関数的に増加するため、できることならマルチスレッドを導入したくありません。

また、NSTimer の代わりに CADisplayLink を使用してみましたが、表示リンクの呼び出しもスクロール アニメーションによってブロックされます。

4

2 に答える 2

0

NSTimer は、実行ループとモードに関連付けられています。イベント トラッキング中のモードはUITrackingRunLoopModeです。デフォルトでは、 によって作成されたタイマーscheduledTimerWithTimeIntervalは で追加されるNSDefaultRunLoopModeため、追跡中には起動しません。

[[NSRunLoop currentRunLoop] addTimer:yourTimer forMode:UITrackingRunLoopMode];
于 2014-12-05T20:43:41.127 に答える
0

bdesham が答えたように、「Apple の最優先事項は UI の応答性です。このような状況では、UI アクションはコードの他の部分をブロックします。タイマーを別のスレッドに移動する必要があります。」

于 2014-10-20T21:40:52.600 に答える