我使用UIScrollView在iPhone上制作大尺寸(大于320像素)的UI。
我创建了一个UIScrollView实例,并在其上添加了一些子视图。 问题是我只想在用户触摸子视图之外启用滚动, 当用户触摸其中一个子视图时停止滚动。
我阅读文档并试图找到样本,但我找不到好的提示。 如果您有任何想法,请帮助我。
答案 0 :(得分:36)
UIScrollView有一个 scrollEnabled 属性,允许您以编程方式禁用滚动。它还有一个委托(UIScrollViewDelegate),允许您查看滚动开始/结束等事件。似乎你应该能够以某种方式结合这些选项来烹饪。
答案 1 :(得分:8)
您真正感兴趣的属性 - 我现在正在测试它,因为我遇到了同样的问题 - canCancelContentTouches
。
如果此属性的值为NO, 滚动视图不会滚动 无论手指移动一次 内容视图开始跟踪。
如果这不能提供您想要的结果,请将UIScrollView子类化并覆盖touchesShouldBegin:withEvent:inContentView
方法,这是接受的答案所暗示的。
答案 2 :(得分:5)
如果要检测UIScrollView的任何子视图内的触摸,则必须子类化UIScrollView并覆盖专门为此目的创建的touchesShouldBegin
和touchesShouldCancelInContentView
方法。
除此之外,您无法识别子视图中的触摸,因为UIScrollView倾向于自己处理所有触摸并且不会将它们传递给其子视图。
一切顺利。
答案 3 :(得分:5)
对于scrollview,最简单的方法是将delayContentTouches
设置为NO
。这样就设置了默认行为,这样任何作为UIControl的东西都会立即将触摸传递给控件,而其他任何东西都会滚动。
答案 4 :(得分:2)
您还可以升级UIScrollViewController并覆盖touchesBegan,touchesMoved和touchesEnded方法。如果您的实现从不调用超类实现,那么它将不会滚动。
答案 5 :(得分:0)
我的问题是拥有一个用户可以插入的视图,但是滚动视图劫持了触摸和滚动功能而不是绘制功能。这是我的工作解决方案:
在我的工程图视图中,我有:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Disable scroll on touch begin
setContainerScrollingEnabled(false)
super.touchesBegan(touches, with: event)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// Reenable scroll on touch end
setContainerScrollingEnabled(true)
super.touchesEnded(touches, with: event)
}
private func setContainerScrollingEnabled(_ enabled: Bool) {
// loop up superviews to find the scrollview
func scrollingSuperview(of view: UIView) -> UIScrollView? {
guard let superview = view.superview else { return nil }
if let scrolling = view.superview as? UIScrollView { return scrolling }
return scrollingSuperview(of: superview)
}
// and switch on/off scrolling
let scrollView = scrollingSuperview(of: self)
scrollView?.isScrollEnabled = enabled
}
,并且在包含滚动视图的视图控制器中:
// Not sure what exactly this does, but I think it allows the drawing view to have precedence. This was the missing piece of the puzzle.
scrollView.delaysContentTouches = false