一般的多层视图中,事件会首先到达最上层的 UIView,该视图可以对事件进行处理,决定是拦截还是继续分发到子试图中。
UIScrollView 也有这样的属性,它的原理是当一个点击事件到来时,会启动一个计时器,当计时器结束期间如果没有手指产生滚动操作,那么点击事件会继续传递给子试图;
否则会产生滚动效果,并且取消消息的继续传递。
UIScrollView 中有两个函数:
// called before touches are delivered to a subview of the scroll view. if it returns NO the touches will not be delivered to the subview
// this has no effect on presses
public func touchesShouldBegin(touches: Set<UITouch>, withEvent event: UIEvent?, inContentView view: UIView) -> Bool
该函数先于子试图的touchesBegin,返回NO 的话点击消息不回传递到子试图,且没有任何点击效果
// called before scrolling begins if touches have already been delivered to a subview of the scroll view. if it returns NO the touches will continue to be delivered to the subview and scrolling will not occur
//