3

我有一个UIScrollView里面另一个UIScrollView。外部滚动视图处理分页,内部滚动视图处理缩放(它是一个支持缩放的图片库)。我需要内部滚动视图来忽略单个触摸,以便它们转到外部滚动视图。

这可以使用 来完成[innerScrollView setUserInteractionEnabled:NO],但这显然也会关闭内部滚动视图上的捏合和平移手势。有没有办法让内部缩放视图处理捏合和平移手势并将所有其他事件转发到响应者链上?

PS。我总是可以带着一些代表团黑客来解决这个问题。我想知道是否有一种简单的方法可以使用常规响应链使其工作。

4

2 回答 2

3

我发现:单击事件最终会touchesBegan:withEvent:进入内部滚动视图内的内容视图。此内容视图未实现该方法,默认UIView实现将事件向上传递到响应者链。这里我们有内部滚动视图,它确实实现了touchesBegan:withEvent:. 这个实现吞下了单次点击,响应者链上没有任何东西。有帮助的是子类UIScrollView化并手动将修饰发送到响应者链:

- (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event
{
    [[self nextResponder] touchesBegan:touches withEvent:event];
}

当然,至少touchesEnded:withEvent:这样转发也是好的。这可以满足我的一切需求。内部滚动视图可以处理缩放和平移,外部滚动视图接收单击事件。我什至可以放大然后平移到右侧,以便转到下一页。

于 2012-06-13T08:53:54.703 回答
2

在 iOS 5 上,UIScrollViews 公开它们的panGestureRecognizerpinchGestureRecognizer.

所以,如果你不需要支持旧的 iOS 版本,你可以试试innerScrollView.panGestureRecognizer.minimumNumberOfTouches = 2.

编辑:这不起作用;scrollView 仍然吞下触摸。我将把它留在这里以供进一步参考。

如果您根本不希望内部滚动视图处理平移,您可能(我没有尝试过)只需删除它的 panGestureRecognizer。

于 2012-06-13T08:37:39.990 回答