0

How can I change iOS sound level with SwiftUI

Slider(value: $viewModel.soundLevel, in: 0...1,step: 0.0625,onEditingChanged: { data in self.viewModel.doSomething() })

and MyClass

func doSomething(){ print("\(soundLevel)") }

I got soundLevel but how I set iOS sound level

dawis11
  • 820
  • 1
  • 9
  • 24

2 Answers2

1

You can change the Device sound level using the MediaPlayer. Setting the Slider of MPVoulumeView() will do the job.

Its really easy if you use the extension provided here: https://stackoverflow.com/a/57449875/12233264

import MediaPlayer

extension MPVolumeView {
    static func setVolume(_ volume: Float) -> Void {
        let volumeView = MPVolumeView()
        let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider

        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
            slider?.value = volume
        }
    }
}

Using it in SwiftUI:

import SwiftUI

struct ContentView: View {

    @State private var soundLevel: Float = 0.5

    var body: some View {
        Slider(value: $soundLevel, in: 0...1,step: 0.0625, onEditingChanged: { data in
            MPVolumeView.setVolume(self.soundLevel)
        })
    }
}
KevinP
  • 2,562
  • 1
  • 14
  • 27
  • thanks! But is not perfect because when change slider position not every time I saw in left corner system sound icon :( –  Mar 14 '20 at 13:31
-3

It's not best approach but you can try:

Using it in your viewModel class:

@Published var soundLevel: Float = 0 {
    didSet{
        MPVolumeView.setVolume(soundLevel)
    }
}

Using it in SwiftUI:

Slider(value: $viewModel.soundLevel, in: 0...1, step: 0.0625)
dawis11
  • 820
  • 1
  • 9
  • 24