11

UIScrollViewページングが有効になっている があり、独自のものを追加UIPanGestureRegonizerしました。特定のインスタンスでは、ビュー コントローラーが を設定scrollview.scrollEnabled = NOし、パン ジェスチャ認識エンジンを追加します (スクロールビュー独自の認識エンジンは使用していません)。

そのため、スクロールは無効になっていますが、ジェスチャー認識エンジンからのユーザーのタッチを待っています。認識すると、スクロールを再度有効にするアクションを呼び出します。

問題は、ユーザーがまだ指を下ろしている間、スクロールビューが指で追跡されないことです。指を離してから再度ドラッグするまで、スクロールは開始されません。したがって、私のジェスチャ認識エンジンはすべてのタッチを飲み込み、スクロールビューに転送しません。

トグルを試みましpanGestureRecognizer.cancelsTouchesInView = NO;たが、効果がないようです (現在、スクロールを再度有効にするとすぐにこの認識機能を削除していますが、これを実行してもしなくても問題は解決しません)。delays...のプロパティも調べましたUIGestureRecognizerが、どちらも役に立っていないようです。

何か案は?これらのイベントをスクロールビューに転送し続けるにはどうすればよいですか?

4

1 に答える 1

5

iOS 5 以降のみをターゲットにしている場合、答えは少し簡単です。その場合、UIScrollView の panGestureRecognizer プロパティを再利用する必要があるからです。

いずれにせよ、重要なステップは、scrollEnabled を再利用するのではなく、代わりに UIScrollView をサブクラス化し、この状態を管理する独自のプロパティを作成し、setContentOffset: をオーバーライドすることです。

    - (void) setContentOffset:(CGPoint)contentOffset
    {
        if(self.programaticScrollEnabled)
            [super setContentOffset:contentOffset];
    }

考えられる iOS 4 以降のソリューションの 1 つを次に示します。

  1. UIScrollView をサブクラス化します (または、必要に応じて、UIScrollView の別のサブクラスをサブクラス化します)。
  2. すべての初期化子をオーバーライドして、セットアップ コードが確実に呼び出されるようにします。
  3. 上記のように、BOOL プロパティを宣言し、setContentOffset: をオーバーライドします。
  4. セットアップ コードで、UIPanGestureRecognizer をセットアップし、プログラムによるスクロールを許可するように状態変数を設定します (それが必要な既定の状態であると仮定します)。

    panRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease];
    //These properties may change according to your needs
    panRecognizer.cancelsTouchesInView = NO;
    panRecognizer.delaysTouchesBegan = NO;
    panRecognizer.delaysTouchesEnded = NO;
    [self addGestureRecognizer:panRecognizer];
    panRecognizer.delegate = self;
    
    self.programaticScrollEnabled = YES;
    
  5. 同時に実行できるジェスチャーを管理します。私の場合:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
        return YES;
    }
    
  6. 必要に応じて、プログラムによるスクロールをオンに戻します。例えば:

    - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
    {
        self.programaticScrollEnabled = YES;
    }
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
    {
        self.programaticScrollEnabled = YES;
        return YES;
    }
    
于 2012-01-25T00:31:54.110 に答える