105

self.view (のビューUIViewCotroller) をダブルタップしたときにコードを呼び出す機能を実装する必要があります。しかし、このビューに他の UI オブジェクトがあり、それらすべてに認識オブジェクトをアタッチしたくないという問題があります。ビューでジェスチャを作成する方法の下にこの方法を見つけましたが、それがどのように機能するかを知っています。現在、サブビューを無視してこの認識エンジンを作成する方法を選択するハンディキャップの前にいます。何か案は?ありがとう。

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[self.view addGestureRecognizer:doubleTap];
4

12 に答える 12

170

UIGestureRecognizerDelegateオブジェクト内のプロトコルを採用しself、ビューを確認するために以下のメソッドを呼び出す必要があります。このメソッド内で、ビューをチェックtouch.viewして適切なブール値 (Yes/No) を返します。このようなもの:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isDescendantOfView:yourSubView]) {
        return NO;
    }
    return YES;
}

編集:@ Ianの答えもチェックしてください!

スイフト5

// MARK: UIGestureRecognizerDelegate methods, You need to set the delegate of the recognizer
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
     if touch.view?.isDescendant(of: tableView) == true {
        return false
     }
     return true
}
于 2013-04-04T14:59:28.863 に答える
122

もう 1 つの方法は、タッチのビューがジェスチャ ビューであるかどうかを比較することです。これは、子孫が条件を通過しないためです。素敵でシンプルなワンライナー:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return touch.view == gestureRecognizer.view
}
于 2016-07-06T06:00:58.357 に答える
23

Swift バリアントの場合:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if touch.view.isDescendantOfView(yourSubView){
        return false
    }
    return true
}

レシーバーが特定のビューのサブビューであるか、そのビューと同一であるかを示す値を 返しisDescendantOfViewます。Boolean

于 2015-02-28T10:37:43.000 に答える
10

完全な迅速なソリューション(デリゲートを実装し、認識機能に設定する必要があります):

class MyViewController: UIViewController UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onBaseTapOnly))
        doubleTapRecognizer.numberOfTapsRequired = 2
        doubleTapRecognizer.delegate = self
        self.view.addGestureRecognizer(doubleTapRecognizer)
    }

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
        if touch.view.isDescendantOfView(self.view){
            return false
        }
        return true
    }

    func onBaseTapOnly(sender: UITapGestureRecognizer) {
        if sender.state == .Ended {
            //react to tap
        }
    }
}
于 2016-07-28T09:20:51.197 に答える
2

上記の解決策に加えて、サブビューを確認することを忘れないUser Interaction Enabledでください。

ここに画像の説明を入力

于 2018-02-25T16:25:35.940 に答える