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”的子视图,它只是一个 UIView。 Block 视图有 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
未调用 iOS 13 UIPanGestureRecognizer 选择器
Swift:获取 UIPanGestureRecognizer 的目标