ViewController 加载时 UISlider 的 AVPlayer currentTime 更新
Posted
技术标签:
【中文标题】ViewController 加载时 UISlider 的 AVPlayer currentTime 更新【英文标题】:AVPlayer currentTime update for a UISlider when ViewController load 【发布时间】:2013-10-01 03:06:52 【问题描述】:我正在AVPlayer
播放歌曲。我为我的媒体播放器和初始化创建了一个单独的视图控制器,我用于播放器的所有方法(播放、暂停、重复、随机播放)都在同一个视图控制器中。
我像这样更新一个滑块:
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(sliderUpdate:) userInfo:nil repeats:YES];`
- (void) sliderUpdate:(id) sender
int currentTime = (int)((song.player.currentTime.value)/song.player.currentTime.timescale);
slider.value=currentTime;
NSLog(@"%i",currentTime);
song.currentTime=currentTime;
int currentPoint=(int)((song.player.currentTime.value)/song.player.currentTime.timescale);
int pointMins=(int)(currentPoint/60);
int pointSec=(int)(currentPoint%60);
NSString *strMinlabel=[NSString stringWithFormat:@"%02d:%02d",pointMins,pointSec];
lblSlidermin.text=strMinlabel;
song.strslidermin=strMinlabel;
一旦我离开视图控制器,当我再次出现时,歌曲正在播放,但问题是滑块没有更新。所以我创建了一个单例类来分配当前播放的歌曲细节。同样在滑块更新中,我为单例类变量分配了playerCurrentTime
(滑块当前值)。我的viewdidload
方法是这样分配的:
if (song.isPlaying==NO)
[self prePlaySong];
else
lblAlbum.text=song.currentAlbum;
lblArtist.text=song.currentArtist;
lblSong.text=song.currentSong;
slider.value=song.currentTime;
slider.maximumValue=song.sliderMax;
slider.minimumValue=song.sliderMin;
imgSong.image=song.songImage;
[btnMiddle setBackgroundImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal];
但滑块没有得到更新。为什么会这样,我该如何解决这个问题?
【问题讨论】:
【参考方案1】:你不应该为此使用计时器,AVPlayer
提供了一个你观察时间的 API。
像这样注册一个观察者(例如viewWillAppear
):
CMTime interval = CMTimeMakeWithSeconds(1.0, NSEC_PER_SEC); // 1 second
self.playbackTimeObserver =
[self.player addPeriodicTimeObserverForInterval:interval
queue:NULL usingBlock:^(CMTime time)
// update slider value here...
];
要注销观察者(例如在viewDidDisappear
),请执行以下操作:
[self.player removeTimeObserver:self.playbackTimeObserver];
希望对您有所帮助。
【讨论】:
【参考方案2】:Swift 3 版本。
注册观察者:
// Invoke callback every second
let interval = CMTime(seconds:1.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
// Queue on which to invoke the callback
let mainQueue = DispatchQueue.main
// Keep the reference to remove
self.playerObserver = player.addPeriodicTimeObserver(forInterval: interval, queue: mainQueue) time in
print(time)
移除一个观察者:
if let observer = self.playerObserver
self.player.removeTimeObserver(observer)
self.playerObserver = nil
【讨论】:
以上是关于ViewController 加载时 UISlider 的 AVPlayer currentTime 更新的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 在推送新的 viewController 时重新加载数据
在 UITableView (swift2) 中选择单元格时更新/重新加载 ViewController
PF QueryCollection ViewController 中首次加载时未出现图像