在iOS 8上按下音量上/下button的最简单的方法

iOS 8上捕捉音量上/下button的最好/最干净的方式是什么?

理想情况下,我想捕捉按键,并防止系统音量改变(或者至less防止音量改变HUD显示)。


有一些旧的答案,使用不推荐使用的方法,并且在iOS 8上似乎不工作。这个iOS 8特定的一个也没有工作。

这个RBVolumeButtons开源类似乎也不能在iOS 8上工作。

首先添加AVFoundationMediaPlayer 框架 ,然后你可以使用下面的代码来检测上/下button按下,

-(void)viewWillAppear:(BOOL)animated { AVAudioSession* audioSession = [AVAudioSession sharedInstance]; [audioSession setActive:YES error:nil]; [audioSession addObserver:self forKeyPath:@"outputVolume" options:0 context:nil]; } -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqual:@"outputVolume"]) { float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume]; NSLog(@"volume changed! %f",volumeLevel); } } 

对于Swift,你可以在你的viewController类中使用下面的代码:

 let volumeView = MPVolumeView(frame: CGRectMake(-CGFloat.max, 0.0, 0.0, 0.0)) self.view.addSubview(volumeView) NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(volumeChanged(_:)), name: "AVSystemController_SystemVolumeDidChangeNotification", object: nil) 

然后添加这个function

 func volumeChanged(notification: NSNotification) { if let userInfo = notification.userInfo { if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String { if volumeChangeType == "ExplicitVolumeChange" { // your code goes here } } } } 

这段代码检测用户显式的音量变化动作,就好像你没有检查显式动作一样,这个函数会自动周期性地调用。

此代码不会阻止系统音量更改

对于swift 3 :(记得添加:import MediaPlayer ..)

  override func viewDidLoad() { super.viewDidLoad() let volumeView = MPVolumeView(frame: CGRect(x: 0, y: 40, width: 300, height: 30)) self.view.addSubview(volumeView) // volumeView.backgroundColor = UIColor.red NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged(notification:)), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil) } func volumeChanged(notification: NSNotification) { if let userInfo = notification.userInfo { if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String { if volumeChangeType == "ExplicitVolumeChange" { // your code goes here } } } } 

….

好的,请参阅audio会话服务参考了解更多信息。 您需要使用AudioSessionInitialize启动audio会话,然后使其与AudioSessionSetActive一起激活,使用AudioSessionAddPropertyListener侦听音量更改并传递具有typesAudioSessionPropertyListener的callback。

这个网站有一个很好的写作: http : //fredandrandall.com/blog/2011/11/18/taking-control-of-the-volume-buttons-on-ios-like-camera/