什么条件会导致 UITapGestureRecognizer 失败但 touchesBegan 成功?
Posted
技术标签:
【中文标题】什么条件会导致 UITapGestureRecognizer 失败但 touchesBegan 成功?【英文标题】:What Condition Would Cause UITapGestureRecognizer to Fail but touchesBegan to Succeed? 【发布时间】:2014-06-10 22:43:37 【问题描述】:考虑以下代码:
@interface TouchDownGestureRecognizer : UIGestureRecognizer
@end
@implementation TouchDownGestureRecognizer
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
NSLog(@"touchesBegan");
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
NSLog(@"touchesMoved");
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
NSLog(@"touchesEnded");
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
NSLog(@"touchesCancelled");
@end
在派生自 UIView 的类的构造函数中
- (id)initWithFrame:(CGRect)frame
<snip>
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[tapRecognizer setDelegate:self];
[self addGestureRecognizer:tapRecognizer];
TouchDownGestureRecognizer *touchDownRecognizer = [[TouchDownGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouchDown:)];
[self addGestureRecognizer:touchDownRecognizer];
<snip>
这个类的一个对象被添加到一个父视图中,并且在大多数情况下,点击子视图会导致 touchesBegan、touchesEnded 和 handleTap 被调用。在某些情况下(我无法确定),handleTap 停止为子视图调用,(而是调用父级的 handleTap)。然而,即使handleTap 停止被调用,touchesBegan 和touchedEnded 继续被调用子视图。我确保 UITapGestureRecognizer 仍在子视图的 gestureRecognizers 数组中。我还确保子视图的 userInteractionEnabled 属性为 YES。 UIView 是否有一些已知的条件或状态,我们会期望这种行为?
【问题讨论】:
似乎与***.com/questions/19095165/…中的问题相同。 【参考方案1】:因此,如果我理解正确,在某些时候子视图的父级 UITapGestureRecognizer 将其称为“handleTap”选择器。当您在子视图的边界之外点击时,可能会发生这种情况。 UIView 的边界与它的框架不同,它的边界决定了 UIView 接收触摸事件的位置,而框架决定了内容的绘制位置。 UIView 的边界独立于其框架,因此即使您在子视图的框架内,您也有可能接触到父级。
问题是,如果是这种情况,我不认为子视图的 touchesBegan 和 touchesEnded 会被调用,但如果您还没有检查过,它是一个开始的地方。也许 GestureRecognizer 仍然接收到该事件,因为它在视图的层次结构中(想想它冒泡),但由于它不负责该事件,它不会调用 handleTap ......但这超出了我的范围和理解范围。
【讨论】:
以上是关于什么条件会导致 UITapGestureRecognizer 失败但 touchesBegan 成功?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 (null || !TryParse) 条件会导致“使用未分配的局部变量”?