15

1つのView Controllerに、1つ持っていmainViewます。そのビューにsidePanelは、フレーム 0,0,86,420 を持つ別のビュー があります。タップジェスチャ認識機能を追加しました。ここで、sidePanelView ではなく、mainView に対してのみジェスチャ認識を有効にしたいと考えています。下の画像を参照してください。

下のビューの上に行く左のビュー

sidePanelView の tapGesture を無効にし、それ以外のすべての領域を有効にしたい。どうやってやるの?(もう1つ言いたいのは、sidePanelView以外の領域はsidePanelViewのparentViewです)。

4

6 に答える 6

27

それは正しいので、バーラトの答えを受け入れる必要があります。私はあなたがそれをどのように行うかを説明したいだけです:

  1. View Controller を に準拠するように定義します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;
    }
    
于 2013-02-09T14:56:52.563 に答える
16

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
   shouldReceiveTouch:(UITouch *)touch;
于 2013-02-08T12:40:02.533 に答える
9

スウィフト 3 バージョン:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if theView.bounds.contains(touch.location(in: theView)) {
        return false
    }
    return true
}
于 2016-11-30T03:38:06.037 に答える
5

同様の問題が発生しました。@Robからの回答を使用することになりました。Swift バージョンは次のとおりです。

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
        return !CGRectContainsPoint(menuView.bounds, touch.locationInView(menuView))
    }
}
于 2016-05-19T00:53:50.923 に答える
3

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

sidePanel.userInteractionEnabled = NO;
于 2013-02-08T12:54:55.170 に答える
1

私は、の助けを借りて、これを行いました

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

その中で、タッチポイントの位置を確認し、タッチの位置に応じて、このように作業しました

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

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

于 2013-02-08T14:33:35.427 に答える