0

私にはUIScrollView子供がいUIViewます。私は先に進み、UITapGestureRecognizer次のように子ビューに a を追加しました:

// in child
- (void)setup
{
    [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]];
}

// およびハンドラ

- (void)handleSingleTap:(UITapGestureRecognizer*)sender
{
     if (sender.state == UIGestureRecognizerStateEnded)
         NSLog(@"tap ended");    // this gets called
     else if (sender.state == UIGestureRecognizerStateBegan)
         NSLog(@"tap began"); // never get's called
}

このコードはビュー コントローラーにある可能性がありますが、ビュー自体でタッチを処理する理由があります。

ご覧のとおり、タップの状態をテストしています。ただし、呼び出される唯一の状態は、ユーザーが画面から指を離してタップを完了したときです。つまり、UIGestureRecognizerStateEnded です。

ユーザーが子ビュー (scrollView 内) をタップすると、親スクロール ビューがすべてのタッチを「インターセプト」し、それらが関連するかどうか (パン、ズームなど) を決定し、そうでない場合はタッチを渡すことを理解しています( es) サブビューまで。したがってtouchesBegan:withEvent:、スクロールビューのサブビューで呼び出されることはありません。

私が望むのは、ユーザーがパン、スクロール、またはタップしたかどうかに関係なく、子ビュー内でタッチダウンイベント (つまり、ユーザーが画面に指を置いた瞬間) を検出し、そのタップを処理することです子供。スクロールビューの動作は変更しないでください。

おそらく、オーバーライドなどのジェスチャ認識機能を使用しないより良いアプローチがあるかもしれませhitTest:withEventんが、私のちっぽけな人間の脳はそれを理解できないようです!

UITableView更新/例:セルを含むスクロールビューである a を見てみると。セルに指を置くと、すぐに強調表示されることに気付くでしょう。次に、スクロールの行為はタップを「キャンセル」します。それが一般的な考え方です。

4

1 に答える 1

0

ジェスチャ レコグナイザーを子ビューに追加すると、スクロール ビューに翻弄され、ユーザーがスクロールするつもりがないと判断した後に、スクロール ビューが渡すことを決定したイベントが発生します。ニーズに合っている場合、簡単な修正の 1 つは次のように設定することです。

tableView.delaysContentTouches = NO;

これにより、タッチ メソッドがすぐに呼び出されます。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html

もう 1 つのオプションは、スクロール ビュー自体でジェスチャをリッスンし、ヒット テストを使用して、ユーザーが子ビューをどのように操作しているかを判断することです。

于 2012-12-07T01:48:55.277 に答える