问题来源:
对于一个UITableView,按照其本身的设置,有以下三种情况:
1)如果点击一个cell的时候,cell会高亮;
2)如果快速擦碰(swipe),cell不会高亮,tableview会滚动;
3)如果点击一个cell,cell高亮,按住不放,然后滑动,tablewview开始滚动,cell高亮取消。
以上现象,是基于什么机制或原理实现的。
分析结果:
UITableView继承自UIScrollView,按照之前文章的说法,UIView的默认做法是,将touch事件的传递是从最外层的subview开始的,hitTest:withEvent:
方法返回的hit-test view应该是外层的subview,但实际上,UIScrollView重载了hitTest:withEvent:
方法,永远返回自己。
对于touch事件的传递,是通过UIScrollView来控制的,当scrollview被手指触碰的时候,会开启一个计时器timer:
1)如果150ms内,你的手指没有明显的移动,scrollview会把touch事件传递给subview(情况1);
2)如果150ms内,手指有明显的滑动,比如swipe,scrollview就是开始滑动,而不会把touch事件传递给subview(情况2);
3)如果150ms内,手指没有明显的滑动,scrollview把事件传递给subview,但之后手指开始滑动,此时,scrollview会发送一个touchesCanclled消息给subview,然后开始滑动(情况3)。
这里,UIScrollView有两个属性与上面的实现机制有关:
delaysContentTouches
默认值为YES,如果设置为NO,touch事件会立即传递给subview,不会有150ms的timer等待。
canCancelContentTouches
默认值为YES,如果设置为NO,touch时间一旦传递给subview,scrollview就不会再发送一个touchesCanclled消息给subview,scrollview也不会再滑动。