2017-03-29 41 views
1

我有兩個UIViewControllers,每個都有一個UISlider。一個滑塊跟蹤從AVPlayer播放的音頻文件的進度,另一個viewcontroller滑塊跟蹤從AVAudioPlayer播放的音頻文件的進度。響應AVPlayer動畫的滑塊非常平滑,而滑塊響應AVAudioPlayer的動畫不平滑。該滑塊設置完全相同,除了我如何獲得每個玩家的當前時間相同,如下圖所示:UISlider進展不順利

//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) 
} 
+0

你是如何觸發你的兩個trackAudio方法是什麼?隨着定時器?如果是這樣,他們是否設置了相同的時間間隔? –

+0

@DuncanC我使用'CADisplayLink'。用代碼更新答案。 – Brosef

+0

只是想通了。所以這個視圖控制器有兩個目的:記錄和播放。錄製先於播放,並涉及使用「CADisplayLink」的動畫。一旦錄製停止並播放錄音,我再次使用'CADisplayLink'來更新滑塊。我從錄製動畫中移除了CADisplayLink,滑塊完美地工作。現在我必須弄清楚如何讓他們一起工作。 – Brosef

回答

0

的原因非光滑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) 
}