【问题标题】:How to get a UIView under a UIScrollView to detect touches?如何在 UIScrollView 下获取 UIView 以检测触摸?
【发布时间】:2011-03-20 01:25:04
【问题描述】:
我的 UIViewController 顶部有一个 UIScrollView,当您在某个位置的页面上时,它可以重新创建类似于 Gowalla iPhone 应用程序中的效果。在我的滚动视图下,我有一个按钮,即使滚动视图的框架覆盖它(它在按钮顶部,滚动视图清晰),我也希望能够执行它的操作。我该怎么做这样的事情?可能吗? (一定是,Gowalla [不知何故] 做到了)
【问题讨论】:
标签:
iphone
uiscrollview
touches
【解决方案1】:
对于我来说,我将通过覆盖以下方法将触摸事件转移到另一个视图。
- – touchesBegan:withEvent:
- – touchesMoved:withEvent:
- – touchesEnded:withEvent:
- – touchesCancelled:withEvent:
这样,
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// pass touch event by default implement.
[super touchesBegan:touches withEvent:event];
// redirect the touch events.
[anotherView touchesBegain:touches withEvent:event];
}
hitTest:withEvent: 用于决定哪个视图应该响应视图层次树上的触摸事件。如果视图不想响应触摸事件,它会在 hitTest 中返回 nil。结果上面的触摸事件方法不会被调用。
【解决方案2】:
我不知道这个“Gowalla”应用程序可能会做什么;希望您对“滚动视图后面的按钮,您可以通过滚动视图触摸”的描述是准确的。
如果您的滚动视图后面的按钮可以调整大小以填充滚动视图的整个contentSize 区域而不会搞砸您的界面,最简单的解决方案是将其放在滚动视图内(在所有其他视图下) 并做到这一点。
否则,您最好的选择可能是创建一个具有清晰背景的自定义视图,并将其放置在上面的滚动视图中。简单的解决方案是让自定义视图(可能是 UIControl)只做触摸按钮所做的任何事情。如果由于某种原因这不可能,您最好的选择是在自定义视图上覆盖 hitTest:withEvent: 以返回底层按钮。我会警惕在滚动视图本身上覆盖 hitTest:withEvent:,因为这可能会干扰滚动。
【解决方案3】:
尝试在滚动视图顶部添加按钮。唯一的问题是如果你点击按钮,你将无法与 scrollView 交互,但它仍然是可见的。