1

UIScrollViewアプリケーションの下端に沿って水平にスクロールする があります。ユーザーが上にスワイプしてコントロール センターを開くと、コントロール センターが指にアタッチされますが、私のscrollViewDidBeginDraggingメソッドが呼び出されるというバグに気付きました。問題は、後続の終了メソッドが呼び出されないことです。つまり、私のスクロール ビューは、誰かがそれを引っ張り始めて停止しなかったと見なします。

これは、コントロール センター (または通知センターもそうだと思います) を開いているときに、タッチが下のアプリに渡されるという既知のことですか? シミュレーターではなく、デバイスでのみ発生するようです (sim では、scrollViewDidBeginDraggingdelegate メソッドは呼び出されません)。

誰でもこれに遭遇しますか?防御するのはかなり難しいようです。

4

1 に答える 1

4

このバグは iOS 8 で発生しました。スクロール ビューとカスタム ジェスチャを使用するその他のビューの両方で、下のジェスチャからスワイプしてコントロール センターを表示するときに、タッチが渡されていました。画面の下部近くに、追跡を開始するいくつかの UIButtons がありました。これらの問題はいずれも、同じジェスチャーを使用してコントロール センターを表示する iOS 7 では発生していませんでした。

iOS 8 に対する私の修正は、アプリケーション デリゲートの applicationWillResignActive および applicationDidBecomeActive メソッドに次のコードを追加することでした。

- (void)applicationWillResignActive:(UIApplication *)application
{
    [application beginIgnoringInteractionEvents];
    [UIView animateWithDuration:0.25 animations:^{
        for (UIWindow *aWindow in application.windows)
        {
            aWindow.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        }
    }];
}


- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [UIView animateWithDuration:0.25 animations:^{
        for (UIWindow *aWindow in application.windows)
        {
            aWindow.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
        }
    } completion:^(BOOL finished) {
        [application endIgnoringInteractionEvents];
    }];
}

このコードは、基本的に、アプリがアクティブ状態を辞任するときに、アプリのすべての対話を遮断します。また、すべてのウィンドウでティント モードを淡色表示に設定することにしました。これは、ユーザーがツールバーの項目や、tintColor を使用する他の UI がアクティブではないことを理解できるようにするための独自の選択です。

アプリが再びアクティブになると、アプリは対話イベントの無視を終了し、ウィンドウの色合いモードを自動に戻します。

これがお役に立てば幸いです。

于 2014-10-22T15:24:01.507 に答える