MPMusicPlayerController setVolume ist seit iOS 7 veraltet
Gibt es eine andere Möglichkeit, die Lautstärke der Systemmusik zu ändern? Vorzugsweise ohne Benutzerinteraktion ..__Das wichtige Merkmal: Automatische Erhöhung der Lautstärke für jeden Wecker aus AppStore.
Um Ihre Frage genau zu beantworten: Ja, es gibt eine andere Möglichkeit, das Systemvolumen ohne Benutzerinteraktion zu ändern.
Bis vor kurzem war ich der Meinung, dass das programmgesteuerte Ändern von Volumes mit MPVolumeView nur mit privater API möglich ist. Ich habe jedoch gerade bestätigt, dass das Ändern des Wertes von volumeSlider und das vorgetäuschte touchUP-Ereignis des Schiebereglers funktioniert:
MPVolumeView* volumeView = [[MPVolumeView alloc] init];
//find the volumeSlider
UISlider* volumeViewSlider = nil;
for (UIView *view in [volumeView subviews]){
if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
volumeViewSlider = (UISlider*)view;
break;
}
}
[volumeViewSlider setValue:1.0f animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
(Wenn der Schieberegler das touchUP-Ereignis empfängt, ruft er die _commitVolumeChange
-Methode für sich selbst auf, wodurch das Systemvolumen geändert wird.)
Bis Apple diese Entscheidung widerrufen kann, gibt es zwei Mittel, die ich entdeckt habe:
Mach einfach das:
let masterVolumeSlider: MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = 1.0
}
@Hurden, ich habe einen Swift-Code geschrieben, um den MPVolumeSlider zu implementieren:
for view in mpVolumeView.subviews {
let uiview: UIView = view as UIView
//println("\(uiview.description)")
if uiview.description.rangesOfString("MPVolumeSlider").first != nil {
mpVolumeSilder = (uiview as UISlider)
currentDeviceVolume = mpVolumeSilder!.value
return
}
}
Die func rangeOfString-Erweiterung String ist hier zu finden Swift: Eine reine Swift-Methode zum Zurückgeben von Bereichen einer String-Instanz (Xcode 6 Beta 5)
Und mit diesem Code können Geste und mpvolumeslider zusammenarbeiten
@IBAction func handlePan(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translationInView(self.view)
let dx = (translation.x-lastTranslationX)
let volumeChanged = Float(dx / mpVolumeView.frame.width)
currentDeviceVolume = currentDeviceVolume + Float(volumeChanged)
if currentDeviceVolume > 1 {
currentDeviceVolume = 1
} else if currentDeviceVolume < 0 {
currentDeviceVolume = 0
}
mpVolumeSilder!.value = currentDeviceVolume
if recognizer.state == .Changed {
lastTranslationX = translation.x
}
if recognizer.state == .Ended || recognizer.state == .Began {
lastTranslationX = 0
}
}
Schnelle Version:
// Outlet added in Storyboard (Add UIView then set class to MPVolumeView)
@IBOutlet weak var mpVolumeView: MPVolumeView!
// Get volume slider within MPVolumeView
for subview in self.mpVolumeView.subviews {
if (subview as UIView).description.rangeOfString("MPVolumeSlider") != nil {
// Set volume
let volumeSlider = subview as UISlider
volumeSlider.value = 1
// Works with or without the following line:
// volumeSlider.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
break
}
}
Anscheinend gibt es mit eine Möglichkeit, das Systemvolumen zu ändern, ohne etwas anzuzeigen.
Und am besten funktioniert es auf iOS 11.
So habe ich es erreicht:
1) Erstellen Sie zwei Variablen im gewünschten ViewController
let volumeView = MPVolumeView()
var slider: UISlider?
2) Fügen Sie den folgenden Code zu Ihrem viewDidLoad hinzu
volumeView.alpha = 0.01
self.view.addSubview(volumeView)
if let view = volumeView.subviews.first as? UISlider {
slider = view
}
3) Ändern Sie die Lautstärke, wann immer Sie brauchen
slider?.value = 0.4
let masterVolumeSlider : MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = fVolume!
view.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
}
Diese Lösung macht ein bisschen nervös und ich finde es ein bisschen seltsam, dass es keine offizielle API gibt, aber hier ist meine Swift-Lösung, die aus AmbientLights Post besteht
var _volumeView = MPVolumeView()
var _volumeSlider : UISlider? = nil
self.view.addSubview(_volumeView)
_volumeView.hidden = true
var i = 0
while i < _volumeView.subviews.count {
if let _r = _volumeView.subviews[i] as? UISlider {
_volumeSlider = _r
break
}
++i
}