如何取消UIScrollView中的滚动

问题描述 投票:15回答:6

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

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

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

iphone cocoa-touch uiscrollview
6个回答
5
投票

如果要检测UIScrollView的任何子视图内的触摸,则必须子类化UIScrollView并覆盖专门为此目的创建的touchesShouldBegintouchesShouldCancelInContentView方法。

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

祝一切顺利。


36
投票

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


8
投票

你真正感兴趣的属性 - 我现在正在测试它,因为我有同样的问题 - 是canCancelContentTouches

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

如果这不能提供您想要的结果,则将UIScrollView子类化并覆盖touchesShouldBegin:withEvent:inContentView方法,这是接受的答案所暗示的。


5
投票

最简单的方法是将delayContentTouches设置为NO以获取scrollview。这样设置默认行为,以便任何作为UIControl的东西都会立即将触摸传递给控件,​​而其他任何东西都会滚动。


2
投票

您还可以升级UIScrollViewController并覆盖touchesBegan,touchesMoved和touchesEnded方法。如果您的实现从不调用超类实现,那么它将不会滚动。


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
© www.soinside.com 2019 - 2024. All rights reserved.