UITableView 设置delaysContentTouches和canCancelContentTouches引发的问题


今天在修改需求时,发现某页面拖动时存在奇怪的问题:

控制器是通过XIB搭起来的,view是UITableView类型, 问题是:当手指在tableView cell 上滑动时,tableView不响应滑动事件(不滑动),但是手指在tableView的底部(没有内容区域)时可以滑动; 当tableView在滑动中时,手指在cell上滑动tableView可以响应滑动事件,一旦滑动事件结束,再去滑动cell时,tableView又无法响应滑动事件;

解决: 首先想到的是delaysContentTouches和canCancelContentTouches属性可能会引起此问题,通过查看控制器中的代码,并未发现设置这两个属性的代码,最终在xib中找到了问题:这两个属性的勾勾都被去掉了,重新勾选这两项后,问题解决;

官方文档

@property(nonatomic) BOOL delaysContentTouches;       // default is YES. if NO, we immediately call -touchesShouldBegin:withEvent:inContentView:. this has no effect on presses
@property(nonatomic) BOOL canCancelContentTouches;    // default is YES. if NO, then once we start tracking, we don't try to drag if the touch moves. this has no effect on presses

delaysContentTouches和canCancelContentTouches都是scrollView的一个属性,在讲这两个属性之前,首先要讲下scrollView的一个机制。 从你的手指touch屏幕开始,scrollView开始一个timer,如果:

150ms内如果你的手指没有任何动作,消息就会传给subView。 150ms内手指有明显的滑动(一个swipe动作),scrollView就会滚动,消息不会传给subView。 150ms内手指没有滑动,scrollView将消息传给subView,但是之后手指开始滑动,scrollView传送touchesCancelled消息给subView,然后开始滚动。 delaysContentTouches:默认值为YES。如果设置为NO,则会立即把事件传递给subView。 canCancelContentTouches:默认为YES,如果设置为NO,这消息一旦传递给subView,这scroll事件不会再发生。

附件: