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); 
  • Как я могу округлить значение float до двух постсимвольных позиций?
  • всплывающее меню iPhone, как iPad popover?
  • UIScrollView не прокручивается после обновления до iOS7 / xcode 5
  • Как я могу отложить вызов метода на 1 секунду?
  • Передача параметров addTarget: действие: forControlEvents
  • Как установить плагин Xcode для автоматического форматирования кода
  • Получите данные Exif от UIImage - UIImagePickerController
  • Как найти причину ошибки «double free» malloc?
  • Добавить UIView над всеми другими видами, включая StatusBar
  • iOS: конвертировать UTC NSDate в локальный часовой пояс
  • NSOperation на iPhone
  • Давайте будем гением компьютера.