gpt4 book ai didi

iphone - 如何可靠地找到 UIGestureRecognizer 的正确 View ?

转载 作者:行者123 更新时间:2023-12-03 18:21:26 25 4
gpt4 key购买 nike

我有一堆 UIView,如下图所示。红色/粉色(半透明) View 位于其他 View 之上。

  • Red 有一个 UISwipeGestureRecognizer
  • Green 具有 UITapGestureRecognizer
  • Blue 没有识别器。

enter image description here

点击绿色的可见(左下)部分会触发其识别器。

点击绿色的隐藏部分不会触发其识别器(红色会阻止它)。

这就是问题所在:我想要触发绿色。我怎样才能做到这一点?

在实践中, View 可以是任意顺序、任意数量并且可以是彼此的 subview 等。但问题是相同的:

如何可靠地找到可以处理手势(点击或滑动)的最上面的 View ?

<小时/>

我尝试使用下面的代码。它巧妙地遍历了所有 View ,但它失败了,因为它无法知道该事件是滑动还是点击的一部分。所以该方法总是返回红色 View 。如果我从 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;
}

最佳答案

将手势识别器添加到这些 View 的另一种方法是将手势识别器添加到父 View ,并使用委托(delegate)方法 gestureRecognizer:shouldReceiveTouch: 方法适本地处理用例。

确定特定识别器是否应接收触摸并返回YES。例如,如果传递的手势识别器是滑动识别器,则检查触摸点是否在绿色 View 内并返回YES。否则返回NO

如果有类似的手势识别器,那么我建议您保留引用并对其进行验证。

使用

- (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;
}

关于iphone - 如何可靠地找到 UIGestureRecognizer 的正确 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6361781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com