我有一堆 UIView,如下图所示。红色/粉色(半透明)视图位于其他视图之上。
- 红色有一个
UISwipeGestureRecognizer
.
- 绿色有作为
UITapGestureRecognizer
.
- 蓝色没有识别器。
轻按一下visible绿色的(左下)部分触发其识别器。
轻按一下hidden绿色部分does not触发其识别器(红色阻止它)。
这就是问题所在:我想要格林触发。我怎样才能做到这一点?
在实践中,视图可以是任意顺序、任意数量并且可以是彼此的子视图等。但问题是相同的:
如何可靠地找到可以处理手势(点击或滑动)的最上面的视图?
我尝试使用下面的代码。它巧妙地遍历了所有视图,但它失败了,因为它无法知道该事件是滑动还是点击的一部分。所以该方法总是返回红色视图。如果我从 Red 中删除滑动识别器,则代码可以正常工作。
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *hitView = [super hitTest:point withEvent:event];
if (hitView == self)
{
if (self.hasASwipeRecognizer)
return self; // What if this was a tap?
if (self.hasATapRecognizer)
return self;
else
return nil;
}
else
return hitView;
}
将手势识别器添加到这些视图的另一种方法是将手势识别器添加到父视图并使用委托方法适当地处理用例gestureRecognizer:shouldReceiveTouch:
方法。
确定特定识别器是否应该接收触摸并返回YES
。例如,如果传递的手势识别器是滑动识别器,则检查触摸点是否在绿色视图内并返回YES
。返回NO
否则。
如果有类似的手势识别器,那么我建议您保留参考并对其进行验证。
Usage
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
CGPoint pointInView = [touch locationInView:gestureRecognizer.view];
if ( [gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]]
&& CGRectContainsPoint(self.blueView.frame, pointInView) ) {
return YES;
}
if ( [gestureRecognizer isMemberOfClass:[UISwipeGestureRecognizer class]]
&& CGRectContainsPoint(self.greenView.frame, pointInView) ) {
return YES;
}
return NO;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)