4

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();
    }
}
4

2 に答える 2

0

これらのイベントを「フラッシュ」する方法は見つかりませんでしたが、すべてのレンダリングが画面に反映されるようにする「ハック」を見つけたので、そのような再描画操作が遅くても、ユーザーはリアルタイムでジェスチャーアクションを見ることができます. 私の解決策は、次のように呼び出すことです:

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];

画面上で再描画を行うために「OSに時間を与える」。iOS 7 以降で実行している場合にのみ、ジェスチャ認識エンジンのコールバック内からこれを行います。

上記の呼び出しは、すべてのジェスチャ レコグナイザーのコールバックに追加する必要があります (新しいコンテンツがレンダリングされた後)。これが誰かを助けることを願っています!

ジェスチャへの直接の応答としてレンダリングが遅い場合、優れたユーザー エクスペリエンスが必要な場合は、iOS 7 で現在この「ハック」が必要なようです。

于 2014-06-27T00:47:25.707 に答える