Кнопки аудиоплеера не работают должным образомIOS

Программируем под IOS
Ответить
Anonymous
 Кнопки аудиоплеера не работают должным образом

Сообщение Anonymous »


Я пытался реализовать аудиоплеер с функциями перемотки назад на 15 секунд, вперед на 15 секунд и функцией переключения паузы/воспроизведения. Всякий раз, когда я нажимаю где-нибудь в HStack, вызывается единственная функция — это функция переключения паузы/воспроизведения. Как я могу получить действие каждой запущенной функции, чтобы гарантировать функциональность аудиоплеера?

Я уже пытался реализовать кнопки в основном файле, но проблема осталась прежней, поэтому я решил исключить их из основного файла.

Код файла кнопок следующий:

struct AudioPlaybackSection: View { @ObservedObject вар audioPlayer: AudioPlayer @Binding var showAlert: Bool var body: some View { ВСтек { ProgressBar (прогресс: $audioPlayer.progress) .frame(высота: 10) .padding() HStack { Разделитель() Кнопка (действие: audioPlayer.rewind15Seconds) { Изображение (имя системы: «gobackward.15») } .frame(ширина: 50, высота: 50) Разделитель() Кнопка (действие: { audioPlayer.togglePlayPause() }) { Изображение (имя системы: audioPlayer.isPlaying? «pause.fill»: «play.fill») .font(.system(размер: 30)) } .frame(ширина: 50, высота: 50) Разделитель() Кнопка (действие: audioPlayer.forward15Seconds) { Изображение (имя системы: «goforward.15») } .frame(ширина: 50, высота: 50) Разделитель() } .padding() .alert(isPresented: $showAlert) { Alert(title: Text("Ошибка"), message: Text("Нет доступного аудиофайла"), ignoreButton: .default(Text("OK"))) } } } } Код аудиоплеера:
импортировать AVFoundation класс AudioPlayer: ObservableObject { частный вар audioPlayer: AVAudioPlayer? частный вар ProgressTimer: Таймер? @Published переменная прогресса: Float = 0,0 @Published var isPlaying: Bool = false // ОТМЕТКА: - Инициализация init (имя_файла: строка, тип_файла: строка) { делать { попробуйте AVAudioSession.sharedInstance().setCategory(.playback) попробуйте AVAudioSession.sharedInstance().setActive(true) } ловить { print("Ошибка конфигурации AudioSession: \(ошибка)") } if let path = Bundle.main.path(forResource: fileName, ofType: fileType) { делать { audioPlayer = попробуйте AVAudioPlayer(contentsOf: URL(fileURLWithPath: путь)) аудиоплеер?.prepareToPlay() } поймать пусть ошибку как NSError { print("Ошибка загрузки аудиофайла: \(error.localizedDescription)") } } NotificationCenter.default.addObserver( себя, селектор: #selector(handleInterruption), имя: AVAudioSession.interruptionNotification, объект: ноль ) } // ОТМЕТКА: - Управление звуком функция воспроизведения () { аудиоплеер?.play() isPlaying = правда ProgressTimer = Timer.scheduledTimer(withTimeInterval: 0.1, повторы: true) {[слабый собственный] таймер в Guard let self = self, let player = self.audioPlayer else { return } self.progress = Float(player.currentTime / player.duration) если !player.isPlaying { таймер.инвалидата() } } } функция пауза() { isPlaying = ложь аудиоплеер?.пауза() ProgressTimer?.invalidate() ProgressTimer = ноль } функция перемотки15Seconds() { Guard let player = audioPlayer else { return } пусть seekTime = max(player.currentTime - 15, 0) player.currentTime = время поиска } функция вперед15Seconds() { Guard let player = audioPlayer else { return } пусть seekTime = min(player.currentTime + 15, player.duration) player.currentTime = время поиска } функция togglePlayPause() { если isPlaying { Пауза() } еще { играть() } } функция остановки() { аудиоплеер?.stop() прогресс = 0,0 ProgressTimer?.invalidate() ProgressTimer = ноль } // МАРК: - Помощник функция isPlayerAvailable() -> Бул { вернуть аудиоплеер!= ноль } // ОТМЕТКА: - Обработка уведомлений @objc func handleInterruption (уведомление: Уведомление) { охранник пусть информация = Notification.userInfo, пусть typeValue = info [AVAudioSessionInterruptionTypeKey] как? UInt, let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { возвращаться } если тип == .began { Пауза() } else if type == .ended { если let optionsValue = info[AVAudioSessionInterruptionOptionKey] как? UInt, AVAudioSession.InterruptionOptions(rawValue: optionsValue).contains(.shouldResume) { играть() } } } // ОТМЕТКА: - Деинициализация деинит { NotificationCenter.default.removeObserver(self) } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»