web-dev-qa-db-ja.com

特定のビューに対してのみジェスチャ認識機能を無効にする

1つのviewControllerに1つのmainViewがあり、そのビューに別のビュー(フレーム0,0,86,420を持つsidePanelビューとして知られています)があります。tapGestureを追加しました。ここで、sidePanelView以外のmainViewに対してのみジェスチャ認識を有効にします。下の画像を参照してください
enter image description here

sidePanelViewのtapGestureを無効にし、それ以外の領域を有効にしたい。どうやるか。 (sidePanelView以外の領域で言いたいのはsidePanelViewのparentViewです)。

14
Ravindra Bagale

私はこれをしました

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

タッチポイントの場所を確認しました。タッチの場所に応じて、次のように作業しました。

if(points.x>86)
    {//hide the side panel
     }

イベントと同期してジェスチャを認識します。

1
Ravindra Bagale

それが正しいので、あなたはバラタの答えを受け入れるべきです。私はあなたがそれをどのように行うかを説明したいだけです:

  1. ビューコントローラをUIGestureRecognizerDelegateに準拠するように定義します。例:

    @interface ViewController () <UIGestureRecognizerDelegate>
    // the rest of your interface
    @end
    
  2. ジェスチャーにdelegateを設定していることを確認してください。

    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleMainTap:)];
    gesture.delegate = self;
    [self.view addGestureRecognizer:gesture];
    
  3. 次に、問題のビューに対してタッチが行われるかどうかを確認します。

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        if (CGRectContainsPoint(self.menuView.bounds, [touch locationInView:self.menuView]))
            return NO;
    
        return YES;
    }
    
25
Rob

UIGestureRecognizerDelegateのgestureRecognizer:shouldReceiveTouch:メソッドを使用して、タッチが発生した場所を確認し、ジェスチャに応答するかどうかを決定できます。タッチがビューの端(tiを無効にする場所)に近すぎる場合はNOを返し、そうでない場合はYESを返します。または、touch.viewをチェックして、UIImageViewでタッチが発生したかどうかを確認します。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
   shouldReceiveTouch:(UITouch *)touch;
14
Bharat Gulati

Swift 3バージョン:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if theView.bounds.contains(touch.location(in: theView)) {
        return false
    }
    return true
}
7
zgjie

同様の問題に遭遇しました。 @Robからの回答を使用することになりました。これがSwiftバージョン:

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
        return !CGRectContainsPoint(menuView.bounds, touch.locationInView(menuView))
    }
}
4
Robert Chen

特定のビューに対してUITapGestureRecognizerを無効にする場合は、userInteractionを削除するだけです。

sidePanel.userInteractionEnabled = NO;
3
thavasidurai