iOS 7 では、Apple はジェスチャ レコグナイザーの動作方法を変更したようです。例として UIPinchGestureRecognizer を考えてみましょう。UIGestureRecognizerStateChanged で遅い再描画操作を行うと、これは以前は古いバージョンの iOS で正常に機能していましたが、新しいバージョンでは、別の StateChanged 更新でピンチ ジェスチャが再度呼び出される前に再描画が画面にレンダリングされません。遅い描画操作が再び呼び出されます。これは、システムがビューへの変更で画面の表示部分を実際に更新する前に、何度も繰り返し発生します。
私は1つの解決策が電話することであることを発見しました:
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
UIGestureRecognizerStateChanged イベントを受け取るたびに。このようにして、描画が完了するたびに画面にレンダリングされます。しかし、一連のピンチ イベントがキューに入る「イベント ラグ」の問題がまだあり、画面のピンチを止めた後も画像のサイズが拡大し続けます。
私の質問は、キューに入れられたピンチ イベントを「フラッシュ」する方法があるかどうかです。そのため、UIGestureRecognizerStateChanged イベントを取得するたびに、遅い描画操作を実行してから、他のすべてのピンチ イベントをフラッシュして、最新のものだけを処理できます。これが可能かどうか知っている人はいますか?UIGestureRecognizerStateChanged イベントの時点を見て、最新の再描画に近すぎるイベントをスローするシステムを構築できると思いますが、それはハックのようです。
- (void) handleGlobalPinchGesture:(UIPinchGestureRecognizer*)_pinchGesture
{
if ( _pinchGesture.state == UIGestureRecognizerStateBegan )
{
// stuff
return;
}
if ( _pinchGesture.state == UIGestureRecognizerStateEnded || _pinchGesture.state == UIGestureRecognizerStateCancelled )
{
// end stuff
return;
}
if (_pinchGesture.state == UIGestureRecognizerStateChanged )
{
doSlowRedrawingOperationHere();
}
}