【问题标题】:System Media Player Progress as UISlider系统媒体播放器进度作为 UISlider
【发布时间】:2016-08-11 00:14:00
【问题描述】:

我正在尝试显示用作进度条的 UISlider。我希望 UISlider 的进度是系统媒体播放器中正在播放的歌曲的当前进度。

这是我的代码:

在我的 headers.h 文件中:

static MPMusicPlayerController *musicPlayer;
NSTimer * currentTimeUpdateTimer;

UISlider *timeSlider;

在加载视图中:

    musicPlayer = [MPMusicPlayerController systemMusicPlayer];

    timeSlider = [[UISlider alloc] initWithFrame:CGRectMake((((scrollView.contentSize.width/2)+(scrollView.contentSize.width/12))-10), 100, (((scrollView.contentSize.width/2)-(scrollView.contentSize.width/6))+20), 80)];
    timeSlider.backgroundColor = [UIColor clearColor];
    timeSlider.minimumTrackTintColor = [UIColor whiteColor];
    timeSlider.maximumTrackTintColor = [UIColor blackColor];
    timeSlider.alpha = 0.8;
    timeSlider.exclusiveTouch = YES;
    [scrollView addSubview:timeSlider];

在 viewDidLoad 中:

currentTimeUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateCurrentiPodItemTime) userInfo:NULL repeats:YES];

userIsScrubbing = NO;

这些是控制和设置 UISlider 值的函数

- (void)updateCurrentiPodItemTime {
MPMediaItem *nowPlayingItem = [musicPlayer nowPlayingItem];

if (nowPlayingItem == nil) {

} else {
double currentTime = musicPlayer.currentPlaybackTime;

if (!userIsScrubbing)
    timeSlider.value = (float) currentTime;
}
}

- (void)handleScrubberTouchDown:(id)sender {
 userIsScrubbing = YES;
}

- (void)handleScrubberTouchUp:(id)sender {
userIsScrubbing = NO;
}

- (void)handleScrub:(id)sender {
musicPlayer.currentPlaybackTime = timeSlider.value;
}

但发生的情况是 UISlider 值始终是满的,并且不会随着歌曲的进展而进展。

UISlider 的意义在于还允许用户浏览正在播放的音乐。

【问题讨论】:

  • 清理了标签。现在为您实际 使用的一种 语言添加标签(提示:您没有添加任何标签)。如果你不知道,最好不要写代码。
  • @Olaf 好的,抱歉。但我认为你需要看看你的语法。 “你最好不要写代码”没有意义。
  • "不理解" :D 无论如何,对我来说,你的实现没问题,我不明白为什么它不起作用。你试过 layoutSubview 吗?
  • 这是一个编程语言网站。只要我的意思很清楚,并且我的程序语法没有问题,这里就不讨论这些缺陷。随意尝试德语。 (顺便说一句。你的引用是错误的。我写了“写”,这显然是错误的。
  • @RomOne 我把计时器实现放在 layoutSubviews 中我仍然得到相同的结果。

标签: ios objective-c


【解决方案1】:

我解决了。 uislider 的最大值为 1。所以我将最大值设置为歌曲的总长度(以秒为单位)。

【讨论】:

  • 干得好,当我告诉你检查值是否大于 1 时,我就是这么想的 ;)
  • @RomOne 是的。我以前应该这样做的。但可惜我没有。感谢您的帮助。
  • @RomOne 我刚刚注意到由于某种原因在另一个函数中我调用了 [[%c(SBMediaController)sharedInstance] play];当使用这个新的 uislider 调用它时,我的设备会冻结。有什么想法吗?
  • 你能判断它是来自内存泄漏还是什么? (只需快速查看内存使用情况,如果它不是太高)如果它只是冻结而没有任何错误,只需按暂停,看看你的应用程序卡在哪里(可能是一个循环?)
  • @RomOne 我在这里将冻结隔离到这一行:timeSlider.value = (float) currentTime;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-04
  • 2021-02-04
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多