Swift. Trying to change volume by UISlider with MPVolumeView. In debug area writes - [MediaRemote] No local output device available

588 views Asked by At

Ok. I'm trying to change volume by my custom UISlider.

I have Player (ViewController), and inside I can see videos from Youtube, so also have control buttons and volume Slider !

I couldn't even imagine that it won't be that easy. Why!?

I find with solution of course with MPVolumeView. But in debug area it writes - '[MediaRemote] No local output device available:'

I've looked through a lot of webpages. So because I'm beginner I can't figure out how to implement it in the right way.

Please, see my code below and tell me pls where I'm wrong or not complete ?!

I understand I'm wrong, but can't guess where. I have too little experience yet. But I'm trying hard.

. See details from code (if need some more, pls tell me) .

lazy var soundSlider: UISlider = {
    let slider = UISlider()
    slider.minimumTrackTintColor = .white
    slider.maximumTrackTintColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 0.7)
    slider.setThumbImage(UIImage(named: "Round_Thumb_VolumeBar"), for: .normal)
    slider.translatesAutoresizingMaskIntoConstraints = false
    
    slider.addTarget(self, action: #selector(handleVolumeSliderChange), for: .valueChanged)
    
    return slider
}()

@objc func handleVolumeSliderChange() {
    print(soundSlider.value)
    
    MPVolumeView.setVolume(soundSlider.value)
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.addSubview(soundSlider)

    soundSlider.leadingAnchor.constraint(equalTo: soundMinButton.trailingAnchor, constant: 10).isActive = true
    soundSlider.trailingAnchor.constraint(equalTo: soundMaxButton.leadingAnchor, constant: -10).isActive = true
    soundSlider.topAnchor.constraint(equalTo: pausePlayButton.bottomAnchor, constant: 43).isActive = true
}

extension MPVolumeView {
static func setVolume(_ volume: Float) {
    
    let volumeView = MPVolumeView()
    let volumeSlider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider
    
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
        volumeSlider?.value = volume
    }
    
}

}
0

There are 0 answers