如何解决如何可靠地找到UIGestureRecognizer的正确视图?
| 我有一堆UIViews,如下图所示。红色/粉色(半透明)视图位于其他视图之上。 红色为UISwipeGestureRecognizer
。
格林(Green)为has1ѭ。
蓝色没有识别器。
点击绿色的可见(左下)部分将触发其识别器。
点击绿色的隐藏部分不会触发其识别器(红色会阻止它)。
这就是问题所在:我希望格林触发。我怎样才能做到这一点?
实际上,视图可以是任意顺序,任意数量,并且可以是彼此的子视图,等等。但是问题是相同的:
如何可靠地找到可以处理手势(轻击或轻扫)的最上方视图?
我尝试使用下面的代码。它整齐地遍历所有视图,但是由于无法知道事件是滑动还是轻击的一部分而失败。因此,该方法始终返回红色视图。如果我从红色中移除了滑动识别器,则代码可以正常工作。
- (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;
}
解决方法
将手势识别器添加到这些视图的另一种方法是将手势识别器添加到父视图,并使用委托方法“ 3”方法适当地处理用例。
确定特定的识别器是否应该接受触摸并返回
YES
。例如,如果通过的手势识别器是滑动识别器,则检查触摸点是否在绿色视图内并返回“ 4”。否则返回ѭ6。
如果有类似的手势识别器,那么我建议您保留一个参考并进行验证。
用法
- (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;
}
, 一种可能的解决方案是在顶部红色视图中添加一个轻击手势识别器,然后每当您获得轻击时,检查轻击点是否与绿色视图相交。如果是这样,请将水龙头转到该视图。如果没有,请忽略水龙头。
, 我的解决方案是:
-(void)handleGesture:(UIGestureRecognizer*)gestureRecognizer {
CGPoint touchPoint = [tapGestureRecognizer locationInView:viewUnderTest];
if ([viewUnderTest pointInside:touchPoint withEvent:nil]) {
NSLog(@\"Hit done in view under test\");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。