UISlider 进展不顺利
Posted
技术标签:
【中文标题】UISlider 进展不顺利【英文标题】:UISlider not progressing smoothly 【发布时间】:2017-03-29 01:19:50 【问题描述】:我有两个 UIViewController,每个都有一个UISlider
。一个滑块跟踪从AVPlayer
播放的音频文件的进度,另一个视图控制器滑块跟踪从AVAudioPlayer
播放的音频文件的进度。响应 AVPlayer
的滑块动画非常平滑,而响应 AVAudioPlayer
的滑块动画不平滑。滑块的设置完全相同,除了我如何获取每个玩家的当前时间,如下所示:
//AVPlayer slider
func trackAudio()
let currentTime = self.newPlayer!.currentTime()
let currentTimeInSeconds = CMTimeGetSeconds(currentTime)
slider.setValue(Float(currentTimeInSeconds), animated: true)
//AVAudioPlayer Slider
func trackAudio()
let currentTime = self.player!.currentTime
slider.setValue(Float(currentTime), animated: true)
func playPressed()
player!.play()
updater = CADisplayLink(target: self, selector: #selector(RecordController.trackAudio))
updater.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
【问题讨论】:
你是如何触发你的两个 trackAudio 方法的?带定时器?如果是,它们是否设置了相同的间隔? @DuncanC 我使用CADisplayLink
。用代码更新答案。
刚刚想通了。所以这个视图控制器有两个用途:记录和播放。录制先于播放并涉及使用CADisplayLink
的动画。一旦录音停止并播放录音,我将再次使用CADisplayLink
来更新滑块。我从录制动画中删除了 CADisplayLink,滑块工作得很好。现在我必须弄清楚如何让他们一起工作。
【参考方案1】:
UISlider 不流畅的原因是因为我在同一个视图控制器中有两个 CADisplayLink。
我最初有以下几点:
var displayLink: CADisplayLink? // for recording animation
var updater: CADisplayLink? // for updating slider
func record()
let displayLink = CADisplayLink(target: self, selector:#selector(RecordController.updateMeters))
displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
func play()
let updater = CADisplayLink(target: self, selector: #selector(RecordController.trackAudio))
updater.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
我通过以下方式让它工作:
func record()
self.displayLink = CADisplayLink(target: self, selector:#selector(RecordController.updateMeters))
self.displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
func play()
self.displayLink = CADisplayLink(target: self, selector: #selector(RecordController.trackAudio))
self.displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
【讨论】:
以上是关于UISlider 进展不顺利的主要内容,如果未能解决你的问题,请参考以下文章
试图操纵 UISlider 的 userInteractionEnabled 属性:不工作
UICollectionViews 线索内的 UISlider 不接收触摸事件