UISlider 延迟调用touchesBegan,延迟调用valueChangeHandle。delay?
Posted hherima
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UISlider 延迟调用touchesBegan,延迟调用valueChangeHandle。delay?相关的知识,希望对你有一定的参考价值。
今天遇到一个体验问题。播放器的UISlider的thumbImage在拖拽后不是立即响应,而是等了0.3或0.5或1秒后才响应。(如何扩大thumbImage的响应区域,可百度)。如图所示:
虽然hitTest已经是UISlider了,但是,仍然登录0.x秒才执行touchesBegan:和valueChangeHandle:方法:
2020-04-08 23:44:31.529270+0800 Video[20192:5334377] hitTest: window = <PlayerSlider: 0x1232247d0>Frame: (48.666667, 192.666667, 283.666667, 36.000000) tag:; value: 3.906000>
2020-04-08 23:44:31.659052+0800 Video[20192:5334377] hitTest: TemplateView touchs = <PlayerSlider: 0x1232247d0>Frame: (48.666667, 192.666667, 283.666667, 36.000000) tag:; value: 4.422000>
2020-04-08 23:44:32.149035+0800 Video[20192:5334377] hitTest: = <PlayerSlider: 0x1232247d0>Frame: (48.666667, 192.666667, 283.666667, 36.000000) tag:; value: 5.023235>
2020-04-08 23:44:32.149381+0800 Video[20192:5334377] hitTest: = <PlayerSlider: 0x1232247d0>Frame: (48.666667, 192.666667, 283.666667, 36.000000) tag:; value: 25.116175>
2020-04-08 23:44:32.149652+0800 Video[20192:5334377] hitTest: = <PlayerSlider: 0x1232247d0>Frame: (48.666667, 192.666667, 283.666667, 36.000000) tag:; value: 25.116175>
2020-04-08 23:44:32.161383+0800 Video[20192:5334377] hitTest: = <PlayerSlider: 0x1232247d0>Frame: (48.666667, 192.666667, 283.666667, 36.000000) tag:; value: 23.138981>
2020-04-08 23:44:32.175762+0800 Video[20192:5334377] hitTest: = <PlayerSlider: 0x1232247d0>Frame: (48.666667, 192.666667, 283.666667, 36.000000) tag:; value: 23.457047>
从23:44:31.659052已经给出了顶层响应view是PlayerSlider了,但是响应的确是:23:44:32.149035 延迟了0.5秒
经过查阅网络资料发现:在UIScrollView中如果实现了UIButton,UISlider等UI控件,会造成延迟响应。这是因为UIScrollView或UITableView属性delaysContentTouches的问题。官方文档:
@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事件不会再发生。
所以一开始,把问题的矛头指向了delaysContentTouches属性,但是已经把工程所有的UIScrollview的delaysContentTouches都设置NO了,仍然复现问题。一筹莫展。
最后只能从view的层级上查问题,到底播放器是哪一层的view出问题。最终查到UITableviewCell上有一个手势,切这个手势设置delaysTouchesBegan属性为YES😲。
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapWithGesture:)];
gesture.delaysTouchesBegan = YES;
[templateView addGestureRecognizer:gesture];
ios setDelaysTouchesBegan 详解
//setDelaysTouchesBegan:NO 会直接将触摸事件发送给视图
//setDelaysTouchesBegan:YES 在手势识别过程中不会将触摸事件发送给视图 只有当手势识别失败时才会发送给视图
注意setDelaysTouchesBegan:YES使用不当可能会造成UI无响应 特殊是手势发生在UIScrollView上。
最后问题就出在这里 delaysTouchesBegan
参考资料:http://alpface.com/article/2018/3/19/46.html
https://blog.csdn.net/jeffasd/article/details/74258104
以上是关于UISlider 延迟调用touchesBegan,延迟调用valueChangeHandle。delay?的主要内容,如果未能解决你的问题,请参考以下文章