2015-10-16 82 views
6

我不得不改变iPad上的音量和使用此代码:iOS 9:如何以编程方式更改音量而不显示系统声音栏弹出?

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0]; 

但这种变化量和显示系统音量控制条上的iPad。 如何在不显示音量栏的情况下更改声音?

我知道,setVolume:已被弃用,大家都说使用MPVolumeView。如果这是解决我的问题的唯一方法,那么如何使用MPVolumeView更改音量?我在MPVolumeView中看不到改变声音的任何方法。
我应该用MPVolumeView与其他课程一起使用吗?

但是最好使用MPMusicPlayerController

谢谢你的建议!

+1

你不应该以编程方式改变音量,这是'setVolume:'被弃用的整点。你的应用可能会被拒绝。 –

回答

10

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

这项工作?我试图使用它没有太大的成功!我添加了一个视图并将其分类到MPVolumeView,但它似乎不工作。 – Gugulethu

+0

为我工作!谢谢! – Jerome

+1

这是非常有用的 – Fluidity

3

我不认为有没有任何方法来改变音量,而不闪烁音量控制。您应该使用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]; 
+0

这适用于我在iOS8上,但不适用于iOS9。有没有iOS9解决方法? – frakman1

1

斯威夫特> 2.2,iOS版> 8.0,

我没有找到任何解决方案,我一直在寻找,但我最终会做这样的解决方案:

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

这是Swift中的解决方案。这可能是一个阴暗的,所以我会让你知道,如果苹果在我发布时批准这一点。同时,这部作品对我蛮好:

  1. 在您的视图控制器

    private let volumeView: MPVolumeView = MPVolumeView() 
    private var volumeSlider: UISlider? 
    
  2. 定义一个MPVolumeView和可选UISlider在故事板,确定这是一个从用户(高度隐藏在视图= 0应该做的伎俩),并为它设置一个插座(我们将它称为hiddenView在这里)。如果你只要不改变音量时显示音量HUD这一步是唯一的好(参见下面的注释):

    @IBOutlet weak var hiddenView: UIView! 
    
  3. 在viewDidLoad中()或某处运行一次NIT-Y,赶上UISlider实际控制音量到可选UISlider步骤(1):

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

重要提示: 该解决方案将防止iPhone的音量HUD出现 - 无论是当用户点击,当你改变你的代码量,或外部音量按钮。如果您确实想要显示HUD,则跳过所有隐藏的视图,并且不要将MPVolumeView作为子视图添加。这将导致iOS在音量改变时显示HUD。

2

版本:斯威夫特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

你应该如何使用它? –

+1

嗨@JonathanPlackett,你可以尝试这样: 'self.volumeSlider.value = 1 //获得最大音量' 顺便说一句,自我意味着MPVolumeView实例。希望得到帮助。 – Jerome

2

@udjat的答案斯威夫特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() 
     } 
    } 
    } 
} 

用法:

// set volume to 50% 
viewController.setVolume(0.5) 
相关问题