Исчезать (анимировать) громкость с помощью MPMediaPlayer Swift 4 - PullRequest
0 голосов
/ 21 декабря 2018

Я использую Xcode 10+, Swift 4 и нацеливаюсь на iOS 11.4+ с MPMediaPlayer

Я бы хотел программно уменьшить громкость проигрывателя (как Apple делает, когда вы выходите из музыкального проигрывателя).Кроме того, я не хочу ничего видеть (например, дисплей VolumeView), когда он функционирует.

Похоже, что все программные регуляторы громкости устарели.

Я прочиталМногие связанные посты и создали эту функцию, которая имеет несколько проблем:

@objc func fadeVolume(){
    var sliderView = UISlider()
    //let volumeView = MPVolumeView(frame: CGRect.init(x: self.view.frame.maxX, y: self.view.frame.maxY, width: 0, height: 0))
    let volumeView = MPVolumeView(frame: .zero)
    volumeView.clipsToBounds = true
    volumeView.showsRouteButton = false
    //volumeView.isHidden = true
    volumeView.alpha = 0.001
    for subview in volumeView.subviews {
        if let slider = subview as? UISlider {
            sliderView = slider
            break
        }
    }
    self.view.addSubview(volumeView)
    volumeView.didMoveToSuperview()

    let current:Float = AVAudioSession.sharedInstance().outputVolume
    print("slider value: \(current)")
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
        UIView.animate(withDuration: 0.4, animations: {
            sliderView.setValue(0.0, animated: false)
        }, completion: { finished in
            // If either one of these is uncommented, the VolumeView will display.
            // However, without removing from superview, the VolumeView stays hidden even when I use the phone volume buttons.
            volumeView.removeFromSuperview()
            //volumeView.alpha = 1.0
        })
    }
}

Первая проблема: дисплей VolumeView отображается на экране.Я пытался использовать разные кадры, изменять альфа и т. Д. Как будто анимация никогда не происходит и она идет непосредственно к блоку завершения.

Вторая проблема: действительно нужно удалить VolumeView из суперпредставленияили же он останется скрытым даже при использовании кнопок громкости телефона.Он должен быть скрыт только во время выполнения этой функции.

Третья проблема: блок анимации ничего не делает.Громкость просто мгновенно изменится с начальной точки на 0 - без затухания.

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

Есть идеи, как уменьшить громкость, не отображая ничего на экране?Ответ не обязательно должен использовать MPVolumeView, но мне нужно, чтобы он работал с MPMediaPlayer и при выходе из приложения.

РЕДАКТИРОВАТЬ: ниже приведен мой модифицированный код, который исчезнет из объема, однако проблема в возможностисделать это, когда мое приложение завершается еще существует.Я могу вызвать этот код из appWillTerminate, однако он не запускается полностью, так как приложение завершает работу, прежде чем оно может пройти весь цикл.

// Public in ViewController Class:
let volumeView = MPVolumeView()
var sliderView = UISlider()
var currentVolume:Float = 0

//This called by a notification:
    @objc func fadeVolume(){
        // A lot of other posts use these to hide the volume view however I only needed the alpha change
        //volumeView.clipsToBounds = true
        //volumeView.showsRouteButton = false
        //volumeView.isHidden = true
        //print("volume alpha \(volumeView.alpha)")
        volumeView.alpha = 0.001
        self.view.addSubview(volumeView)
        volumeView.didMoveToSuperview()
        if let view = volumeView.subviews.first as? UISlider {
            sliderView = view
        }
        print("slider value: \(sliderView.value)")
        currentVolume = sliderView.value
        changeVolumeSlowly()
    }
    @objc func changeVolumeSlowly(){
        sliderView.value = sliderView.value - 0.1
        print("\(sliderView.value)")
        if sliderView.value > 0 {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in
                self?.changeVolumeSlowly()
            }
        } else {
            myMP.pause()
            myMP.stop()
            //reset
            // Since the volumeView is 'global' to the app, if you do not change
            // it back to the previous volume and make it visible you won't see it unless you restart your app.
            //Unfortunately these cause the volume view to flash onscreen
            volumeView.alpha = 1.0
            sliderView.value = currentVolume
            volumeView.removeFromSuperview()
        }
    }

1 Ответ

0 голосов
/ 14 февраля 2019

Сделайте вашу переменную UISlider общедоступной и используйте эту функцию для уменьшения громкости звука.

@objc func changeVolumeSlowly(){
    sliderView.value = sliderView.value - 0.1
    print("\(sliderView.value)")
    if sliderView.value > 0 {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in
            self?.changeVolumeSlowly()
        }
    }
}
...