可缩放的UIScrollView与UIButtons捕捉触摸
我有一个UIScrollView,我正在实现viewForZoomingInScrollView:
委托方法,它返回一个用户可以放大和平移的UIImage。 我也有一些UIButtons作为UIScrollView的子视图,我用它作为注释,如Google Maps。
我遇到的问题是,当放大右键时,很多UIImage可能会被UIButtons遮挡。 当试图缩放时,UIButtons正在接收触摸事件,而缩放没有发生。 你最终不得不小心地将手指放在空旷的地方放大。
我注意到,当有很多注释视图时,Google地图应用似乎可以正常工作,但仍然可以捏合。
我想我需要重点触摸,UIScrollView需要响应捏和平底锅,而按钮只是轻拍。
任何人都有这方面的经验?
我有这个确切的问题,这有点奇怪。 这不是由于按钮上有任何手势识别器,它是由于某种原因被转发到UIButton的UIScrollView的捏手势识别器。 此外,UIButton响应某些UIGestureRecognizerDelegate调用(如-gestureRecognizerShouldBegin :)但不是其他人(如-gestureRecognizer:shouldReceiveTouch :)。 这就像UIScrollView有选择性地将一些委托调用转发给UIButton,有些不是。
我终于找到了解决这个问题的非常简单的方法:
yourScrollView.pinchGestureRecognizer.delaysTouchesBegan = YES;
yourScrollView.pinchGestureRecognizer.delaysTouchesEnded = YES;
幸运的是,UIScrollView上的默认缩放手势识别器是可公开访问的,并且默认情况下两个“延迟拖动”属性为NO。 当您将它们设置为YES时,如果手势识别器可能或者确实意识到捏手势,即使它在UIButton的顶部开始,它也不会将这些触摸转发到UIButton,并且UIButtons不会再干扰UIScrollView的缩放。
尝试这个
UIGestureRecognizer* tapRecognizer = nil;
for (UIGestureRecognizer* recognizer in yourButton) {
if ( ![recognizer isKindOfClass:[UITapGestureRecognizer class]] ) {
[yourButton removeGestureRecognizer:recognizer];
break;
}
}
因此您可以从与UITapGestureRecognizer不同的按钮中移除所有的手势识别器
看看UIView的hitTest:withEvent:
方法。 在该方法内,你需要检查你想返回哪个视图。 你回归的观点将成为接受这一点的人。 例如,您可以对按钮进行子类化并重写该方法以针对您的特定场景返回ImageView
。
上一篇: Zoomable UIScrollView with UIButtons capturing touches
下一篇: how to scroll uiscrollview from event touched by uibutton in scrollview