【问题标题】:Why is my subclassed UIView not recieving touches moved when in a UIScrollView?为什么我的子类 UIView 在 UIScrollView 中没有收到移动的触摸?
【发布时间】:2010-01-15 01:46:12
【问题描述】:
我有一个名为 Boards 的类,它是 UIView 的子类,我分配了一个实例并将其放入 UIScrollView,我想而不是他触及到 UIScrollView,但是子视图:Boards(UIView),我只是不知道如何将触摸从UIScrollView 传递到UIView。
P.S:我将手动更改UIScrollView 的contentOffset,因此我不需要UIScrollView 中的触摸,而是UIView。
P.S:UIView 正在接收 touchesEnded 和 touchesBegan 事件,而不是 touchesMoved
【问题讨论】:
标签:
iphone
uiview
uiscrollview
touchesmoved
【解决方案1】:
如果您希望 UIScrollView 仅以编程方式滚动,则必须对其进行子类化并覆盖 touchesBegan/Moved/Canceled/Ended 方法。即使那样,您也可能会遇到问题。 UIScrollView 并非旨在忽略用户输入。
如果可能,您应该将 UIScrollView 替换为自定义视图。您可以更改视图的 transform 属性来移动其内容,而不是更改 contentOffset。
或者你可以嵌套两个视图,一个外部视图和一个内部视图。将您的 Boards 视图放在内部视图中。然后,不要更改contentOffset,而是更改内部视图的frame。
如果动画很重要,我很确定第二个选项将提供动画过渡,而第一个选项也可能。
【解决方案2】:
为什么不创建 UIScrollView 的子类?
然后,将子类接收到的所有触摸事件传递给 UIView,如下所示。
@implementation SubclassOfScrollView
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.nextResponder touchesBegan:touches withEvent:event];
}
@end
【解决方案3】:
关于问题here 的新更新(包括指向 ZoomScrollView 源代码的链接 + 一些关于 UIScrollView 内部的出色解释)。
另外,请查看 Apple 更新的 ScrollViewSuite 示例。它在第三个示例中有您描述的场景。
【解决方案4】:
尝试在滚动视图中关闭delaysContentTouches。这将立即将所有子触摸直接转发到子视图,而不检查它是否是 滚动视图触摸。