iOS 9:如何以编程方式更改音量,而不显示系统声音栏popup?

我不得不在iPad上更改音量并使用以下代码:

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0]; 

但是这个改变的音量和iPad上显示的系统音量栏。 如何更改声音而不显示音量栏?

我知道, setVolume:被弃用,每个人都说使用MPVolumeView 。 如果这是解决我的问题的唯一方法,那么如何使用MPVolumeView更改音量? 在MPVolumeView中没有看到改变声音的任何方法。
我应该与MPVolumeView一起使用一些其他类吗?

但是最好使用MPMusicPlayerController

谢谢你的build议!

MPVolumeView有一个滑块,通过更改滑块的值,可以更改设备的音量。 我写了一个MPVolumeView扩展来轻松访问滑块:

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

我不认为有没有任何方法来改变音量没有闪烁音量控制。 你应该像这样使用MPVolumeView

 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]; 

版本: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 } } 

Swift 3中的 @udjat的回答

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

Swift> 2.2,iOS> 8.0,

我没有find任何解决scheme,但我最终这样做的解决scheme:

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

这是Swift中的一个解决scheme。 这可能是一个阴暗的,所以我会让你知道,如果苹果在我发布时批准这一点。 同时,这对我来说工作得很好:

  1. 在View Controller中定义一个MPVolumeView和一个可选的UISlider

     private let volumeView: MPVolumeView = MPVolumeView() private var volumeSlider: UISlider? 
  2. 在故事板中,定义一个对用户隐藏的视图(height = 0应该可以做到这一点),并为它设置一个出口(我们将在这里称它为hiddenView )。 如果您在更改音量时不希望显示音量平视显示器(请参见下面的注释),则此步骤仅适用于:

     @IBOutlet weak var hiddenView: UIView! 
  3. 在viewDidLoad()或某个运行一次的init-y中,从步骤(1)中将实际控制音量的UISlider捕捉到可选的UISlider中:

     override func viewDidLoad() { super.viewDidLoad() ... hiddenView.addSubview(volumeView) for view in volumeView.subviews { if let vs = view as? UISlider { volumeSlider = vs break } } } 
  4. 当您想要在代码中设置音量时,只需将volumeSlider?.value设置为0.0到1.0之间的任意值,例如,增大音量:

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

重要提示:此解决scheme将防止iPhone的音量HUD出现 – 无论是在您的代码中更改音量还是用户单击外部音量button。 如果你想显示HUD,那么跳过所有的隐藏视图的东西,而不要添加MPVolumeView作为子视图。 这将导致iOS在音量改变时显示HUD。

 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() } } } } 

用法:

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