6

Ich habe Lautstärke auf dem iPad ändern und mit diesem Code:iOS 9: Wie kann die Lautstärke programmgesteuert geändert werden, ohne das Soundbar-Popup des Systems anzuzeigen?

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0]; 

Aber dieses änderndem Volumen und zeigt Systemlautstärkeleiste auf dem iPad. Wie ändere ich den Sound, ohne die Lautstärkeleiste anzuzeigen?

Ich weiß, setVolume: ist veraltet, und jeder sagt, MPVolumeView zu verwenden. Wenn dies der einzige Weg ist, um mein Problem zu lösen, dann, wie das Volumen mit MPVolumeView ändern? Ich sehe keine Methode in MPVolumeView, die den Ton ändert.
Sollte ich einige andere Klassen zusammen mit MPVolumeView verwenden?

Aber es ist vorzuziehen, MPMusicPlayerController zu verwenden.

Danke in Beratung!

+1

Sie sollten die Lautstärke nicht programmgesteuert ändern, das ist der ganze Sinn von 'setVolume:' ist veraltet. Deine App könnte abgelehnt werden. –

Antwort

10

MPVolumeView hat einen Schieberegler, und durch den Wert des Schiebers ändern, können Sie das Gerät Lautstärke ändern. Ich schrieb eine MPVolumeView Erweiterung auf einfache Weise den Schieber 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 
    } 
} 
+0

Hat das funktioniert? Ich versuche es ohne viel Erfolg zu benutzen! Ich fügte eine Ansicht hinzu und unterordnete sie zu MPVolumeView, aber es scheint nicht zu funktionieren. – Gugulethu

+0

Arbeit für mich! Danke! – Jerome

+1

das war super nützlich – Fluidity

3

Ich glaube nicht, dass es eine Möglichkeit gibt, die Lautstärke ohne blinkende Lautstärkeregelung zu ändern. Sie sollten MPVolumeView wie folgt 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]; 
+0

Dies funktioniert für mich auf iOS8, funktioniert aber nicht auf iOS9. Gibt es eine iOS9-Problemumgehung? – frakman1

1

Swift> 2.2, iOS> 8.0,

ich keine Lösung gefunden, die ich suchte, aber ich am Ende tue dies 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

Hier ist eine Lösung in Swift. Es könnte ein zwielichtiger sein, also werde ich dich wissen lassen, ob Apple dies genehmigt hat, wenn ich es veröffentliche. Inzwischen arbeitet das für mich ganz gut:

  1. einen MPVolumeView definieren und einen optionalen UISlider in Ihrem View-Controller

    private let volumeView: MPVolumeView = MPVolumeView() 
    private var volumeSlider: UISlider? 
    
  2. Im Storyboard, eine Ansicht definieren, die von dem Benutzer (Höhe versteckt = 0 sollte den Trick machen), und stellen Sie eine Steckdose für sie (wir nennen es hiddenView hier). Dieser Schritt ist nur gut, wenn man die Lautstärke HUD nicht angezeigt werden soll, wenn die Lautstärke zu ändern (siehe Hinweis unten):

    @IBOutlet weak var hiddenView: UIView! 
    
  3. In viewDidLoad() oder irgendwo init-y, die einmal ausgeführt wird, die UISlider fangen, die tatsächlich steuert die Lautstärke in den optionalen UISlider aus Schritt (1):

    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 festlegen möchten, nur volume gesetzt .value zwischen 0,0 und 1,0 überall sein, zBdie Lautstärke zu erhöhen:

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

Wichtiger Hinweis: Diese Lösung wird der Volume HUD iPhone verhindern erscheinen - entweder, wenn Sie die Lautstärke in Ihrem Code zu ändern, oder wenn der Benutzer klickt auf die externe Lautstärketasten. Wenn Sie das HUD anzeigen möchten, überspringen Sie alle versteckten Ansichten und fügen Sie das MPVolumeView nicht als Unteransicht hinzu. Dadurch wird iOS das HUD anzeigen, wenn sich das Volume ändert.

2

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 
    } 
} 
+0

wie soll man das benutzen? –

+1

Hallo @ JonathanPlackett, können Sie versuchen, wie folgt: 'self.volumeSlider.value = 1 // Holen Sie die maximale Lautstärke ' BTW, selbst bedeutet MPVolumeView-Instanz. Hoffnung auf Hilfe. – Jerome

2

@udjat ‚s 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 
    } 
} 
1
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() 
     } 
    } 
    } 
} 

Verbrauch:

// set volume to 50% 
viewController.setVolume(0.5) 
Verwandte Themen