我有一个UIView,它有两个子视图,一个是UIScrollView,另一个是其他一些子视图的容器视图。容器视图完全覆盖滚动视图。
需要处理手势的视图:
现在为了通过容器视图子视图处理轻击手势,我为容器视图实现了pointInside:withEvent :.如果它识别出该点在其子视图中,则返回YES。这很好用。问题是,当我捏或平移时,我的手指最初触摸其中一个容器视图子视图,它不起作用。当我在容器视图的空白区域上捏或平移时,它可以正常工作。
有关如何使其发挥作用的任何建议吗?
修改
我已经为主视图实现了hitTest:withEvent:并且得到了相同的行为。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *hitTestView;
for (UIView *subview in [self.subviews reverseObjectEnumerator])
{
hitTestView = [subview hitTest:[self convertPoint:point
toView:subview]
withEvent:event];
if (hitTestView && ![hitTestView isKindOfClass:[ContainerView class]])
{
break;
}
}
return hitTestView;
}
在底线上的问题是,一个视图如何仅处理某些手势并传递其他手势,以便底层视图可以处理它们。
我已经阅读了很多关于这个主题的内容,并尝试了不同的方法,但找不到一个直接的解决方案来解决看似非常普遍的问题。
答案 0 :(得分:2)
您实际上不需要手动处理UIScrollView上的pinch和pan手势,它会自动发生。
要处理容器视图子视图,您可以使用UITapGestureRecognizer。对于每个视图,您需要处理点击使用:
UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFirstSubview:)];
[firstSubview addGestureRecognizer:tapRecognizer];
处理程序方法:
- (void)handleTapFirstSubview:(UITapGestureRecognizer *)tapRecogmizer
{
// handle tap here
}