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?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 折叠动画 UISlider

如何在 iOS 中延迟 UISlider 的开始触摸事件?

在 uitableviewcell 中激活 uislider 的延迟时间

接触延迟开始

如何加速 touchesBegan 事件触发?

touchesBegan 和 touchesEnded 未在 UIButton 上调用