webentwicklung-frage-antwort-db.com.de

iOS 9: Wie kann ich die Lautstärke programmgesteuert ändern, ohne das Popup-Menü des System-Soundbars anzuzeigen?

Ich muss die Lautstärke auf dem iPad ändern und diesen Code verwenden:

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0];

Dies ändert jedoch die Lautstärke und zeigt die Systemvolumenanzeige auf dem iPad. Wie kann ich den Sound ändern, ohne den Lautstärkebalken anzuzeigen?

Ich weiß, setVolume: ist veraltet und jeder sagt, MPVolumeView zu verwenden. Wenn dies die einzige Möglichkeit ist, mein Problem zu lösen, wie kann man dann die Lautstärke mit MPVolumeView ändern? Ich sehe keine Methode in MPVolumeView, die den Sound verändert. 
Soll ich eine andere Klasse zusammen mit MPVolumeView verwenden?

Es ist jedoch vorzuziehen, MPMusicPlayerController zu verwenden.

Danke für deinen Rat!

12
mgv

MPVolumeView verfügt über einen Schieberegler. Durch Ändern des Schiebereglers können Sie die Gerätelautstärke ändern. Ich habe eine Erweiterung von MPVolumeView geschrieben, um einfach auf den Schieberegler zuzugreifen:

extension MPVolumeView {
    var volumeSlider:UISlider {
        self.showsRouteButton = false
        self.showsVolumeSlider = false
        self.hidden = true
        var slider = UISlider()
        for subview in self.subviews {
            if subview.isKindOfClass(UISlider){
                slider = subview as! UISlider
                slider.continuous = false
                (subview as! UISlider).value = AVAudioSession.sharedInstance().outputVolume
                return slider
            }
        }
        return slider
    }
}
14
udjat

Für 2018 unter iOS 11.4 arbeiten

Sie müssen slider.value nach einer kurzen Verzögerung ändern.

extension MPVolumeView {
  static func setVolume(_ volume: Float) {
    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
    }
  }
}

Verwendungszweck:

MPVolumeView.setVolume(0.5)

Objective-C-Version

27
trungduc

Ich glaube nicht, dass es eine Möglichkeit gibt, die Lautstärke zu ändern, ohne den Lautstärkeregler zu blinken. Sie sollten MPVolumeView folgendermaßen verwenden:

MPVolumeView* volumeView = [[MPVolumeView alloc] init];

// Get the Volume Slider
UISlider* volumeViewSlider = nil;

for (UIView *view in [volumeView subviews]){
    if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
        volumeViewSlider = (UISlider*)view;
        break;
    }
}

// Fake the volume setting
[volumeViewSlider setValue:1.0f animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
4
Abhinav

@udjats Antwort in Swift 3

extension MPVolumeView {
    var volumeSlider: UISlider? {
        showsRouteButton = false
        showsVolumeSlider = false
        isHidden = true
        for subview in subviews where subview is UISlider {
            let slider =  subview as! UISlider
            slider.isContinuous = false
            slider.value = AVAudioSession.sharedInstance().outputVolume
            return slider
        }
        return nil
    }
}
3
BumMo Koo

Version: Swift 3 & Xcode 8.1

extension MPVolumeView {
    var volumeSlider:UISlider { // hacking for changing volume by programing
        var slider = UISlider()
        for subview in self.subviews {
            if subview is UISlider {
                slider = subview as! UISlider
                slider.isContinuous = false
                (subview as! UISlider).value = AVAudioSession.sharedInstance().outputVolume
                return slider
            }
        }
        return slider
    }
}
2
Jerome
extension UIViewController {
  func setVolumeStealthily(_ volume: Float) {
    guard let view = viewIfLoaded else {
      assertionFailure("The view must be loaded to set the volume with no UI")
      return
    }

    let volumeView = MPVolumeView(frame: .zero)

    guard let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider else {
      assertionFailure("Unable to find the slider")
      return
    }

    volumeView.clipsToBounds = true
    view.addSubview(volumeView)

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak slider, weak volumeView] in
      slider?.setValue(volume, animated: false)
      DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak volumeView] in
        volumeView?.removeFromSuperview()
      }
    }
  }
}

Verwendungszweck:

// set volume to 50%
viewController.setVolume(0.5)
2
Senseful

Hier ist eine Lösung in Swift. Es könnte ein zwielichtiges sein, also werde ich Sie wissen lassen, ob Apple dies bei der Veröffentlichung genehmigt hat. Mittlerweile funktioniert das für mich gut:

  1. Definieren Sie in Ihrem View Controller ein MPVolumeView und einen optionalen UISlider

    private let volumeView: MPVolumeView = MPVolumeView()
    private var volumeSlider: UISlider?
    
  2. Definieren Sie im Storyboard eine Ansicht, die für den Benutzer verborgen ist (height = 0 sollte den Trick ausführen), und legen Sie einen Auslass dafür fest (wir nennen ihn hiddenView). Dieser Schritt ist nur dann sinnvoll, wenn Sie die Lautstärkepegel NICHT anzeigen möchten, wenn Sie die Lautstärke ändern (siehe Hinweis unten):

    @IBOutlet weak var hiddenView: UIView!
    
  3. In viewDidLoad () oder an einem anderen Ort, an dem init-y einmal ausgeführt wird, fangen Sie den UISlider, der das Volume tatsächlich steuert, in den optionalen UISlider von Schritt (1) aus ein:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        ...
    
        hiddenView.addSubview(volumeView)
        for view in volumeView.subviews {
            if let vs = view as? UISlider {
                volumeSlider = vs
                break
            }
        }
    }
    
  4. Wenn Sie die Lautstärke in Ihrem Code einstellen möchten, setzen Sie den Wert für volumeSlider? .Val auf einen Wert zwischen 0,0 und 1,0, z. zur Erhöhung der Lautstärke:

    func someFunc() {
        if volumeSlider?.value < 0.99 {
            volumeSlider?.value += 0.01
        } else {
            volumeSlider?.value = 1.0
        }
    }
    

Wichtiger Hinweis: Diese Lösung wird verhindert, dass das Volume HUD des iPhones erscheint - entweder wenn Sie die Lautstärke in Ihrem Code ändern oder wenn der Benutzer auf die externen Lautstärketasten klickt. Wenn Sie das HUD anzeigen möchten, überspringen Sie alle versteckten Ansichten und fügen Sie MPVolumeView keinesfalls als Unteransicht hinzu. Dies bewirkt, dass iOS das HUD anzeigt, wenn sich die Lautstärke ändert.

2
deebugger

Swift> 2.2, iOS> 8.0, 

Ich habe keine Lösung gefunden, die ich gesucht habe, aber ich mache das als Lösung:

let volumeView = MPVolumeView()

override func viewDidLoad() {
    ...
    view.addSubview(volumeView)
    volumeView.alpha = 0.00001
}

func changeSpeakerSliderPanelControls(volume: Float) {
    for subview in self.volumeView.subviews {

        if subview.description.rangeOfString("MPVolumeSlider") != nil {
             let slider = subview as! UISlider
             slider.value = volume

             break
        }
    }
}
1
CodeOverRide

Sie können den Standard-UISlider mit diesem Code verwenden:

    import MediaPlayer

    class CusomViewCOntroller: UIViewController

    // could be IBOutlet
    var customSlider = UISlider()

    // in code
    var systemSlider =  UISlider()

    override func viewDidLoad() {
            super.viewDidLoad()

       let volumeView = MPVolumeView()
       if let view = volumeView.subviews.first as? UISlider{
          systemSlider = view
       }
    }

als nächstes schreiben Sie einfach in den Code

systemSlider.value = customSlide.value