Как получить текущий объем iPhone и изменить его во время воспроизведения музыки с помощью swift? - PullRequest
0 голосов
/ 10 ноября 2018

В моем приложении мне нужно изменить громкость с помощью ползунка, у меня есть текущая громкость с

@IBOutlet weak var volumeChange: UISlider! {
    didSet {
        let audioSession = AVAudioSession.sharedInstance()
        let volume : Float = audioSession.outputVolume
        volumeChange.setValue(volume, animated: true)
    }
}

Как я могу это изменить? Теперь у меня есть этот метод

@IBAction func handleVolumeChange(_ sender: UISlider) {
    player.volume = sender.value
}

Этот метод не работает в этом случае. Можно ли сделать так, как, например, в приложении «Музыка»: изменение громкости в приложении с изменением громкости на устройстве?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

получить текущий объем системы -

var session = AVAudioSession.sharedInstance()

override func viewDidLoad() {
    super.viewDidLoad()

    if ((try? session.setActive(true)) != nil) {
        volumeChange.setValue(session.outputVolume, animated: true)
    }
}
0 голосов
/ 10 ноября 2018

Чтобы получить объем, вам нужно будет использовать AVAudioSession.sharedInstance().outputVolume, как вы уже использовали.

Чтобы пользователь мог контролировать громкость, вам нужно взглянуть на MPVolumeView, найденный в платформе Media Player. Этот компонент может вносить изменения в системный том.

Очень просто использовать:

let volumeView = MPVolumeView(frame: volumeViewSize)
playerView.addSubview(volumeView)

Вы захотите использовать этот класс вместо своего экземпляра UISlider. Существуют методы, которые позволяют переопределить внешний вид слайдера.

Кроме того, этот класс предоставляет элемент управления, который позволяет пользователю выбирать выходной маршрут (например, iPhone, Airpods, Homepod или Apple TV). Вы можете отключить ползунок или элемент управления выходным маршрутом, так что это дает вам довольно широкий набор опций для настройки вашего пользовательского интерфейса.

Если вы работаете с раскадровкой, вам нужно будет добавить ее в код. Сначала создайте пустой UIView в представлении контроллера представления на раскадровке и присоедините его к контроллеру представления:

A view controller story board with a placeholder view

Как только вы добавите это, вы захотите что-то вроде следующего в вашем контроллере вида:

@IBOutlet var volumeSliderContainer: UIView!

private lazy var volumeView: MPVolumeView = {
    let volumeView = MPVolumeView(frame: volumeSliderContainer.bounds)
    volumeView.showsVolumeSlider = true
    volumeView.showsRouteButton = true
    volumeView.translatesAutoresizingMaskIntoConstraints = false
    return volumeView
}()

override func viewDidLoad() {
    super.viewDidLoad()

    volumeSliderContainer.addSubview(volumeView)
    NSLayoutConstraint.activate([
        volumeView.widthAnchor.constraint(equalTo: volumeSliderContainer.widthAnchor),
        volumeView.heightAnchor.constraint(equalTo: volumeSliderContainer.heightAnchor),
        volumeView.centerXAnchor.constraint(equalTo: volumeSliderContainer.centerXAnchor),
        volumeView.centerYAnchor.constraint(equalTo: volumeSliderContainer.centerYAnchor),
    ])
}

Теперь вы сможете взаимодействовать с MPVolumeView, как вам требуется.

Просто следите за симулятором, компонент не будет отображать слайдер, и вы сможете увидеть его только при запуске приложения на реальном устройстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...