如何使 Progressbar(UISlider) 在我的应用程序中动态工作? [复制]
Posted
技术标签:
【中文标题】如何使 Progressbar(UISlider) 在我的应用程序中动态工作? [复制]【英文标题】:How to make the Progressbar(UISlider) work dynamically in my app? [duplicate] 【发布时间】:2011-09-20 07:13:10 【问题描述】:可能重复:UISlider to control AVAudioPlayer
我正在尝试为 iPhone 开发一个简单的音频播放器应用程序,我需要实现必须根据歌曲(媒体文件)长度运行的进度条。我怎样才能做到这一点?我可以使用带计时器的滑块吗? 任何帮助都提前表示感谢,谢谢。
【问题讨论】:
【参考方案1】:如果您使用AVPlayer
播放音频,那么您可以使用它的**addPeriodicTimeObserverForInterval**:
方法来更新您的UISlider。例如,如果您的滑块名称是playerScrubber
:
AVPlayerItem *newPlayerItem = [[AVPlayerItem alloc] initWithAsset:<your asset>];
AVPlayer* player = [[AVPlayer alloc] initWithPlayerItem:newPlayerItem];
CMTime interval = CMTimeMake(33, 1000); // 30fps
id playbackObserver = [player addPeriodicTimeObserverForInterval:interval queue:dispatch_get_current_queue() usingBlock: ^(CMTime time)
CMTime endTime = CMTimeConvertScale (player.currentItem.asset.duration, player.currentTime.timescale, kCMTimeRoundingMethod_RoundHalfAwayFromZero);
if (CMTimeCompare(endTime, kCMTimeZero) != 0)
double normalizedTime = (double) player.currentTime.value / (double) endTime.value;
playerScrubber.value = normalizedTime;
];
当你完成后:
[player removeTimeObserver:playbackObserver];
祝你好运!
【讨论】:
有效,但答案已过时请更新,因为“dispatch_get_current_queue()”自 ios 6 起已弃用【参考方案2】:我会说是的,UISlider 是你最好的朋友。这也是 iPod 的用途。您必须稍微修改 t 以直观地指示进度。 制作一个计时器来轮询播放的位置并相应地更新滑块的值。 您可以将滑块的最小值设为 0,将最大值设为播放时间(以秒为单位)。
看看 Stack Overflow 上的这篇文章,它有一个很好的演示:UISlider with ProgressView combined
【讨论】:
【参考方案3】:如果您使用 AVAudioPlayer,那么它有一个名为 currentTime 的属性。您可以将其值分配给 UIProgressBar 值,例如:
progressBar.value=myPlayer.currentTime;
您需要设置一个计时器来不断更新进度。
【讨论】:
currentTime
适用于 AVAudioPlayer
,但不适用于 AVPlayer
。
这就是我说If you use AVAUdioPLayer
的原因。我在任何地方都看不到 currentTime 适用于这两种情况。
对@Mike。我看到我在去年被AVPlayer
困住时对此发表了评论。然而,最近对你投反对票的不是我。 Həmdə həmvətənıq eləbir!
实际上我认为我的评论是因为你有myPlayer
而不是myAudioPlayer
,由于命名约定,这可能会产生误导。
嗯,我编码的方式是你有 AVPlayer 或 AVAudioPlayer。几乎没有人会同时使用两者来进行声音输出,这会导致您所说的误导。你不觉得尴尬吗?以上是关于如何使 Progressbar(UISlider) 在我的应用程序中动态工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章