UISlider для управления AVAudioPlayer

Я пытаюсь реализовать небольшую функцию в своем приложении. В настоящее время я играю звуки как AVAudioPlayers, и это отлично работает. То, что я хотел бы добавить, – это контролировать положение звука (currentTime) с помощью UISlider: есть ли простой способ сделать это?

Я посмотрел на проект Apple, но это было довольно грязно … у вас есть образцы или предложения?

Спасибо всем заблаговременно

Чтобы продлить ответ Паула, вы должны установить ползунок непрерывным с максимальным значением продолжительности вашего аудиоплеера, а затем добавить какой-либо ваш объект (возможно, 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); 
  • iOS 8 Снимок снимка, который не был отображен, приводит к созданию пустого моментального снимка
  • iVar свойство, доступ через self?
  • Получить текущего первого ответчика без использования частного API
  • Свойства IBOutlet не обновляются при использовании метода prepareForSegue
  • Круговые контрольные бары в IOS
  • Получение видимого прямоугольника содержимого UIScrollView
  • Одновременные распознаватели жестов в Iphone SDK
  • Изменение позиции UIBarButtonItem в UINavigationBar
  • Выясните, кадр UIBarButtonItem в окне?
  • UIButton внутри представления с UITapGestureRecognizer
  • Как использовать UIPanGestureRecognizer для перемещения объекта? iPhone / IPad
  • Давайте будем гением компьютера.