UISlider для управления AVAudioPlayer
Я пытаюсь реализовать небольшую функцию в своем приложении. В настоящее время я играю звуки как AVAudioPlayers, и это отлично работает. То, что я хотел бы добавить, – это контролировать положение звука (currentTime) с помощью UISlider: есть ли простой способ сделать это?
Я посмотрел на проект Apple, но это было довольно грязно … у вас есть образцы или предложения?
Спасибо всем заблаговременно
- канонический способ рандомизации NSArray в Objective C
- NULL против нуля в Objective-C
- Как распечатать имя метода и номер строки и условно отключить NSLog?
- UIPopoverPresentationController на iOS 8 iPhone
- Как получить подстроку NSString?
- NSMutableString как сохранить / скопировать
- Ошибка сервера Bootstrap в Xcode IPHONE
- objective-C: Как получить адрес маршрутизатора?
- API, чтобы определить, работает ли на iPhone или iPad
- iOS HTTP-запрос в фоновом режиме
- Как я смогу удалить объекты из NSMutableArray?
- установить фоновое изображение для всего приложения iPhone / iPad
- Как распознать салфетки во всех четырех направлениях?
Чтобы продлить ответ Паула, вы должны установить ползунок непрерывным с максимальным значением продолжительности вашего аудиоплеера, а затем добавить какой-либо ваш объект (возможно, controller вида) в качестве цели для события UIControlEventValueChanged
слайдера; когда вы получите сообщение о действии, вы должны установить AVAudioPlayer
currentTime
AVAudioPlayer
на значение ползунка. Вы также можете использовать NSTimer
для обновления значения ползунка при воспроизведении звукового проигрывателя; +scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
самый простой способ сделать это.
Не должно быть проблем – просто установите ползунок в непрерывном режиме и установите максимальное значение на длительность вашего проигрывателя после загрузки звукового файла.
редактировать
Я просто сделал это, и это работает для меня …
- (IBAction)slide { player.currentTime = slider.value; } - (void)updateTime:(NSTimer *)timer { slider.value = player.currentTime; } - (IBAction)play:(id)sender { NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sound.caf" ofType:nil]]; NSError *error; player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; if (!player) NSLog(@"Error: %@", error); [player prepareToPlay]; slider.maximumValue = [player duration]; slider.value = 0.0; [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]; [player play]; }
Ползунок настроен в IB, как кнопка для начала воспроизведения.
Обновление Swift 3.0:
var player: AVAudioPlayer! var sliderr: UISlider! @IBAction func play(_ sender: Any) { var url = URL(fileURLWithPath: Bundle.main.path(forResource: "sound.caf", ofType: nil)!) var error: Error? do { player = try AVAudioPlayer(contentsOf: url) } catch let error { } if player == nil { print("Error: \(error)") } player.prepareToPlay() sliderr.maximumValue = Float(player.duration) sliderr.value = 0.0 Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.updateTime), userInfo: nil, repeats: true) player.play() } func updateTime(_ timer: Timer) { sliderr.value = Float(player.currentTime) } @IBAction func slide(_ slider: UISlider) { player.currentTime = TimeInterval(slider.value) }
Мне нужно было немного адаптировать приведенный выше ответ, чтобы заставить его работать. Проблема в том, что использование
slider.maximumValue = [player duration]; slider.value = player.currentTime; player.currentTime = slider.value;
Не работайте, потому что слайдер ожидает поплавок и текущий ток игрока, а возврат – CMTime. Чтобы сделать эти работы, я адаптировал их для чтения:
slider.maximumValue = CMTimeGetSeconds([player duration]); slider.value = CMTimeGetSeconds(player.currentTime); player.currentTime = CMTimeMakeWithSeconds((int)slider.value,1);