16

我使用 UIScrollView 在 iPhone 上制作大尺寸(大于 320 像素)的 UI。

我创建了一个 UIScrollView 实例并在其上添加了一些子视图。问题是我只想在用户触摸子视图外部时启用滚动,当用户触摸子视图之一时停止滚动。

我阅读了文档并试图找到样本,但找不到好的提示。如果您有任何想法,请帮助我。

4

6 回答 6

36

UIScrollView 有一个scrollEnabled属性,允许您以编程方式禁用滚动。它还有一个委托 (UIScrollViewDelegate),允许您查看诸如滚动开始/结束之类的事件。似乎您应该能够以某种方式将这些选项组合起来。

于 2008-12-20T13:32:50.617 回答
8

你真正感兴趣的属性——实际上我现在正在测试它,因为我遇到了同样的问题——是canCancelContentTouches.

如果此属性的值为 NO,则一旦内容视图开始跟踪,无论手指移动如何,滚动视图都不会滚动。

如果这不能为您提供所需的结果,请将 UIScrollView 子类化并覆盖该touchesShouldBegin:withEvent:inContentView方法,这是公认的答案所暗示的。

于 2010-09-28T05:45:29.273 回答
5

如果您想检测 UIScrollView 的任何子视图内的触摸,您必须继承 UIScrollView 并覆盖专门为此目的创建的touchesShouldBegin和方法。touchesShouldCancelInContentView

除此之外,您无法识别子视图中的触摸,因为 UIScrollView 倾向于自行处理所有触摸并且不会将它们传递给其子视图。

祝一切顺利。

于 2008-12-25T06:07:29.780 回答
5

最简单的方法是设置delaysContentTouchesNO滚动视图。这样就设置了默认行为,以便 UIControl 的任何内容都会立即将触摸传递给控件,​​而其他所有内容都会滚动。

于 2009-01-21T12:22:02.070 回答
2

您还可以子类化 UIScrollViewController 并覆盖 touchesBegan、touchesMoved 和 touchesEnded 方法。如果您的实现从不调用超类实现,则它不会滚动。

于 2008-12-23T17:21:27.813 回答
1

我的问题是有一个用户可以绘制的视图,但滚动视图劫持了触摸和滚动而不是绘制。这是我的工作解决方案:

在我的绘图视图中,我有:

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
于 2019-04-08T21:38:17.150 回答