我有一个UIScrollView,我正在实现viewForZoomingInScrollView:
委托方法,它返回一个用户可以缩放和平移的UIImage。我还有一些UIButtons作为UIScrollView的子视图,我正在使用它作为注释,如谷歌地图。
我遇到的问题是UIButton在缩小时可能会遮挡很多UIImage。当尝试捏合缩放时,UIButtons正在接收触摸事件,而不会发生缩放。您最终必须小心地将手指放在空旷的地方才能放大。
我注意到,当有很多注释视图时,谷歌地图应用程序似乎工作正常,你仍然可以捏。
我想我需要优先考虑触摸,UIScrollView需要响应捏和平底锅,而按钮只需点击。
任何人都有这方面的经验吗?
答案 0 :(得分:1)
我有这个问题,这有点奇怪。这不是因为按钮上的任何手势识别器,UIScrollView的捏手势识别器由于某种原因被转发到UIButton。此外,UIButton响应某些UIGestureRecognizerDelegate调用(如-gestureRecognizerShouldBegin :)但不响应其他人(如-gestureRecognizer:shouldReceiveTouch :)。它就像UIScrollView有选择地将一些委托调用转发给UIButton而有些则没有。
我终于找到了解决这个问题的简单方法:
yourScrollView.pinchGestureRecognizer.delaysTouchesBegan = YES;
yourScrollView.pinchGestureRecognizer.delaysTouchesEnded = YES;
幸运的是,UIScrollView上的默认捏合手势识别器是可公开访问的,默认情况下两个delaysTouches属性为NO。当您将它们设置为YES时,如果手势识别器可能或确实识别出捏合手势,即使它在UIButton顶部开始,它也不会将这些触摸转发到UIButton,并且UIButton将不再干扰UIScrollView的缩放。
答案 1 :(得分:0)
试试这个
UIGestureRecognizer* tapRecognizer = nil;
for (UIGestureRecognizer* recognizer in yourButton) {
if ( ![recognizer isKindOfClass:[UITapGestureRecognizer class]] ) {
[yourButton removeGestureRecognizer:recognizer];
break;
}
}
所以你从不同于UITapGestureRecognizer的按钮中删除所有的手势识别器
答案 2 :(得分:0)
看看UIView的hitTest:withEvent:
method。在该方法中,您需要检查要返回的视图。您返回的视图将是接收触摸的视图。例如,您可以对按钮进行子类化并覆盖该方法以返回特定方案的ImageView
。
答案 3 :(得分:0)
我以不同的方式解决了这个问题,但这可能不是你的情况。 我的按钮被添加到图像视图中,图像视图自己添加到另一个容器视图中。在:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
...方法,我返回了图片视图 - 不好。更改为在层次结构中返回我的第一个容器视图修复了触摸。