使用UIButtons捕获触摸的Zoomable UIScrollView

时间:2012-09-07 13:57:16

标签: iphone ios uiscrollview uikit uibutton

我有一个UIScrollView,我正在实现viewForZoomingInScrollView:委托方法,它返回一个用户可以缩放和平移的UIImage。我还有一些UIButtons作为UIScrollView的子视图,我正在使用它作为注释,如谷歌地图。

我遇到的问题是UIButton在缩小时可能会遮挡很多UIImage。当尝试捏合缩放时,UIButtons正在接收触摸事件,而不会发生缩放。您最终必须小心地将手指放在空旷的地方才能放大。

我注意到,当有很多注释视图时,谷歌地图应用程序似乎工作正常,你仍然可以捏。

我想我需要优先考虑触摸,UIScrollView需要响应捏和平底锅,而按钮只需点击。

任何人都有这方面的经验吗?

4 个答案:

答案 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

...方法,我返回了图片视图 - 不好。更改为在层次结构中返回我的第一个容器视图修复了触摸。