首页 文章

UIPanGestureRecognizer顶级视图没有获取事件,子视图消耗它们

提问于
浏览
1

在顶级UIView上使用UIPanGestureRecognizer和UITapGestureRecognizer .

Interface Builder中的设置:

  • ViewController (我们的主视图控制器)

  • UIView (我们的主视图并连接到我们的UIViewController

  • 我们的核心 UIView 有一个名为“ Block ”的子视图,它只是一个 UIView .

  • Block 视图有4个 subviews (子),每个都是 UIButton 的一个实例 .

  • UIButtonTouch Up Inside 事件连接到UIViewController .

  • UIView(我们的主要顶级UIView)有 UIPanGestureRecognizerUITapGestureRecognizer

这是我们要完成的场景(a.k.a . 行为):

  • 用户点击按钮(单元格) .

  • 该按钮将其声明从“正常”更改为“已选择” . (这很好,代码很简单)

  • 使用所选项目,用户可以将手指放在屏幕上的任何位置,然后向上或向下移动

问题:

  • 需要知道平移何时停止 .

  • 顶级UIView没有收到声明已结束的手势 .

  • UIView没有收到touchesEnded事件 .

你怎么知道用户何时抬起手指?假设当我的手指在UIButton上方时我开始平移,而在发生平移时,UIButton会尝试触摸开始和结束事件 . 因此,您无法知道用户何时停止在iPhone / iPad玻璃上移动手指 .

1 回答

  • 1

    首先在视图控制器中实现 UIGestureRecognizerDelegate . 然后将手势识别器上的委托设置为self并实现以下方法

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
     return YES;
    }
    

    您的目标方法应如下所示:

    -(void)gestureRegognized:(UIGestureRecognizer*)gestureRecognizer
    {
     if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]])
     {
       //check its state
       if(gestureRecognizer.state==UIGestureRecognizerStateBegan)
       {
         // add your code here
       }
       else if(gestureRecognizer.state==UIGestureRecognizerStateEnded)
       {
         // pan gesture ended code goes here
       }
    
     }
     else if([gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]])
     {
       if(gestureRecognizer.state!=UIGestureRecognizerStateFailed)
       {   
         // tap gesture detected
       }
     }
    }
    

相关问题