由于苹果对MP的弃用,现在做的播放器都开始采用了AVPlayer。AVPlayer给了开发者们极大的灵活性去添加控件实现对用的方法,也带来了一些比较麻烦的问题,比如滑动滑竿时滑竿颤抖,这个在一些上架的App上很常见。
可能每个人的状况不一样,先交代一下我自定义控件的状况:
进度条用的UISilder,修改了滑块的大小和形状(这个不是重点),拖动滑块时的关键代码如下图:
如果你的代码原理和我一样,那么咱们遇到的情况就是一样的。
我分析的原因如下:
滑竿被拖动时不停触发seekToTime 这个方法, 这个方法完成时一个回调,这个回调相对于滑竿拖动是有延迟的,也就是播放器锁定下一次开始播放的位置跟不上滑竿变化的速度,而每一次的回调又必须执行(执行时触发观察者方法重新为滑竿进度赋值),所以此时会产生冲突。
解决方式有很多种,我想了个比较简单的,代码修改起来比较少的,思路大致是这样的:
自定义一个UISlier,添加一个属性BOOL isDraging,当开始拖动的时候isDraging = YES,这时候即使seekToTime回调了,只要isDraging还是YES(说明还在拖动),就不让播放器播放,当为NO时(说明手离开了滑竿不再拖动了),开始让播放器播放;
.m文件需要重写这两个方法:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
self.isTouch = YES;
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesEnded:touches withEvent:event];
self.isTouch = NO;
}
第一个方法中将属性置为YES;
第二个方法中将属性置为NO;
在拖动滑竿那个方法中添加判断如下:
我测试的是没有问题的,大家可以测试一下这个方法,如果有更好的方法欢迎分享。
个人原创,转载请注明出处,谢谢。