私には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 を見てみると。セルに指を置くと、すぐに強調表示されることに気付くでしょう。次に、スクロールの行為はタップを「キャンセル」します。それが一般的な考え方です。