UIPanGestureRecognizer ***视图未获取事件,子视图使用它们

Posted

技术标签:

【中文标题】UIPanGestureRecognizer ***视图未获取事件,子视图使用它们【英文标题】:UIPanGestureRecognizer top level view not getting events, subviews consuming them 【发布时间】:2014-05-08 13:30:28 【问题描述】:

在*** UIView 上使用 UIPanGestureRecognizer 和 UITapGestureRecognizer。

Interface Builder 中的设置:

ViewController(我们的主视图控制器) UIView(我们的主视图并连接到我们的 UIViewController 我们的核心 UIView 有一个名为“Block”的子视图,它只是一个 UIViewBlock 视图有 4 个子视图(子视图),每个都是 UIButton 的实例。 UIButton 将其 Touch Up Inside 事件连接到 UIViewController。 UIView(我们的主要*** UIView)有一个 UIPanGestureRecognizer 和一个 UITapGestureRecognizer

这是我们试图完成的场景(也就是行为):

    用户点击按钮(单元格)。 按钮将其状态从“正常”更改为“选中”。 (这很好用,代码很简单) 使用选定的项目,用户可以将手指放在屏幕上的任意位置并向上或向下移动

问题:

需要知道何时停止平移。 顶部 UIView 没有收到说明结束的手势。 UIView 没有收到 touchesEnded 事件。

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

【问题讨论】:

【参考方案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
   
 

【讨论】:

谢谢。看来我的问题是我在界面生成器中添加了一个 UIPanGestureRecognizer,设置了委托和操作。在 IBAction 中,我将方法设置为 - (IBAction)onPanGesture:(UIPanGestureRecognizer *)recognizer;这是失败的。当我简单地对手势识别器的创建进行硬编码(如上所述)时,现在一切正常。 很高兴我能帮上忙。如果对我的回答满意,请采纳。

以上是关于UIPanGestureRecognizer ***视图未获取事件,子视图使用它们的主要内容,如果未能解决你的问题,请参考以下文章

如何在父视图中限制 UIPanGestureRecognizer

UIPanGestureRecognizer 干扰滚动

未调用 iOS 13 UIPanGestureRecognizer 选择器

Swift:获取 UIPanGestureRecognizer 的目标

当对象移动到某个帧时如何停止 UIPanGestureRecognizer

在父 UIView 中移动 UIView (UIPanGestureRecognizer)