5

view1 という UIView があります。view1 には subview というサブビューがあります。UITapGestureRecognizer次のようにサブビューに追加しました:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];
[subview addGestureRecognizer:recognizer];

サブビューとビュー 1 の間で重なっている領域をタップすると、handleTap メソッドが呼び出されました。しかし、view1 の外にあるサブビューの領域をタップすると、handleTap は呼び出されませんでした。この振る舞いは正しいですか?そうでない場合、何をチェックすればよいかについての提案はありますか?

ところで: UIPanGestureRecognizer は正常に動作します。上記の動作は示しません。

ここに画像の説明を入力

4

3 に答える 3

2

これが UiView のデフォルトの動作です。サブビューは親ビューの境界内にある必要があります。別のものが必要な場合は、トップビューのカスタムサブクラスを作成してオーバーライドします(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

于 2012-06-02T22:13:45.873 に答える
1

親ビューをカスタマイズして、タッチの処理方法を変更する必要があります。詳細については、この質問を参照してください。

于 2012-06-02T22:11:44.907 に答える
0

pointInside:withEvent: のオーバーライドについて話している回答には、説明や実装の詳細が欠けていることがわかりました。元の質問では、ユーザーが黒いラベルのない領域/ビュー (view2 と呼びます) をタップすると、イベント フレームワークは、view2 (およびそのすぐ下のサブビュー) を介してメイン ウィンドウの hitTest:withEvent: のみをトリガーします。であり、pointInside:point でテストされたポイントが view1 のフレームの境界外にあるため、view1 にはヒットしません。subview1 にジェスチャを登録させるには、view2 の hitTest:withEvent の実装をオーバーライドして、サブビューの pointInside:point のチェックを含める必要があります。

//This presumes view2 has a reference to view1 (since they're nested in the example).
//In scenarios where you don't have access, you'd need to implement this
//in a higher level in the view hierachy

//In view2
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        let ptRelativeToSubviewBounds = convert(point, to: view1.subview)
        if view1.subview.point(inside:ptRelativeToSubviewBounds, with:event){
            return view1.subview
        }
        else{
            return super.hitTest(point, with: event)
        }
于 2018-08-18T00:34:32.290 に答える