Swift:如何覆盖scrollView的方法?

时间:2016-11-15 18:24:36

标签: ios swift cocoa-touch uiscrollview override

我试图覆盖scrollview的子类的 touchesShouldCancel 方法。

这是我的子类代码:

class MyScrollView: UIScrollView {
    override func touchesShouldCancel(in view: UIView) -> Bool {
        print("Works")
        return false
    }
}

我已经制作了这个类的滚动视图,它滚动它只是没有打印"工作"。我想为此添加一些功能,但它永远不会被调用。根据苹果文档:

'滚动视图在开始向内容视图发送跟踪消息后调用此方法。'

这让我相信每当我滚动时都应该调用该方法,但我无法弄清楚它为什么不滚动。如果有人有任何想法,欢呼。

1 个答案:

答案 0 :(得分:1)

来自docs

  

因为滚动视图没有滚动条,所以它必须知道触摸是否表示要滚动的意图与跟踪内容中的子视图的意图。为了做出这种确定,它通过启动计时器暂时拦截触碰事件,并且在计时器触发之前,查看触摸手指是否进行任何移动。如果计时器在没有显着位置变化的情况下触发,则滚动视图将跟踪事件发送到内容视图的触摸子视图。如果用户在计时器过去之前将手指拖得足够远,则滚动视图会取消子视图中的任何跟踪并执行滚动操作。子类可以覆盖touchesShouldBegin(_:with:in :),isPagingEnabled和touchesShouldCancel(in :)方法(由滚动视图调用),以影响滚动视图处理滚动手势的方式。

做这个实验。

  1. 在滚动视图中添加子视图以拦截触摸(想想UIButton,而不是UILabel)。
  2. 确保您的内容实际上可滚动
  3. 按下按钮并等待片刻,然后开始滑动手指。
    • 当您点击滚动视图并立即开始拖动时,它会假定您要滚动滚动视图而不是与按钮交互。
    • 但是,当您稍微暂停时,它会确定您是否尝试与滚动视图或按钮进行交互。
  4. touchesShouldCancel然后开火。