0

我有一个 UIScrollView 并且我正在实现一个viewForZoomingInScrollView:委托方法,它返回一个 UIImage ,用户可以缩放和平移。我还有一些 UIButtons 作为 UIScrollView 的子视图,我将其用作注释,例如 Google Maps。

我遇到的问题是很多 UIImage 可以在缩小时被 UIButtons 遮挡。当试图捏缩放 UIButtons 正在接收触摸事件,而不是缩放。您最终不得不小心地将手指放在清晰的空间中进行缩放。

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

我想我需要优先考虑触摸,UIScrollView 需要响应捏和平移,而按钮只是轻按。

有人有这方面的经验吗?

4

4 回答 4

1

我有这个确切的问题,这有点奇怪。这不是由于按钮上的任何手势识别器,而是 UIScrollView 的捏合手势识别器由于某种原因被转发到 UIButton。此外,UIButton 正在响应某些 UIGestureRecognizerDelegate 调用(如 -gestureRecognizerShouldBegin:),但不响应其他调用(如 -gestureRecognizer:shouldReceiveTouch:)。就像 UIScrollView 选择性地将一些委托调用转发给 UIButton 而有些则没有。

我终于找到了一个非常简单的方法来解决这个问题:

yourScrollView.pinchGestureRecognizer.delaysTouchesBegan = YES;
yourScrollView.pinchGestureRecognizer.delaysTouchesEnded = YES;

幸运的是,UIScrollView 上的默认捏合手势识别器是可公开访问的,两个 delaysTouches 属性默认为 NO。当您将它们设置为 YES 时,如果手势识别器可能或确实识别出捏合手势,即使它从 UIButton 顶部开始,它也不会将这些触摸转发到 UIButton,并且 UIButtons 将不再干扰 UIScrollView 的缩放。

于 2013-11-07T20:46:34.933 回答
0

看看 UIView 的hitTest:withEvent: 方法。在该方法中,您需要检查要返回的视图。您返回的视图将是收到触摸的视图。例如,您可以对按钮进行子类化并覆盖该方法以返回ImageView您的特定场景。

于 2012-09-07T17:12:02.640 回答
0

我以不同的方式解决了这个问题,但这可能不是你的情况。我的按钮被添加到图像视图上,图像视图被自己添加到另一个容器视图中。在里面:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

...方法,我返回了图像视图 - 不好。更改为在层次结构中返回我的第一个容器视图修复了这些问题。

于 2014-05-23T14:15:46.180 回答
0

尝试这个

 UIGestureRecognizer* tapRecognizer = nil;    
for (UIGestureRecognizer* recognizer in yourButton) {
    if ( ![recognizer isKindOfClass:[UITapGestureRecognizer class]] ) {
        [yourButton removeGestureRecognizer:recognizer];
        break;
    }
}

所以你从与 UITapGestureRecognizer 不同的按钮中删除所有手势识别器

于 2012-09-07T16:51:07.050 回答