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

如何防止 UISlider 在捕捉/步进时跳到位

试图操纵 UISlider 的 userInteractionEnabled 属性:不工作

UICollectionViews 线索内的 UISlider 不接收触摸事件

UISlider + UISwipeGestureRecognizer 第一次不工作

UISlider 具有不均匀的步骤。