Подтвердить что ты не робот

Самый чистый способ захвата кнопки увеличения/уменьшения громкости нажмите на iOS 8

Какой лучший/самый чистый способ захвата кнопки увеличения и уменьшения громкости нажимает на iOS 8?

В идеале я хотел бы захватить нажатие клавиши, а также предотвратить изменение объема системы (или, по крайней мере, предотвратить показ HUD смены громкости).


Есть несколько старых ответов, вокруг которых используются устаревшие методы и, похоже, не работают вообще на iOS 8. Этот iOS 8 специфический не работал либо.

Этот RBVolumeButtons класс с открытым исходным кодом, похоже, тоже не работает на iOS 8.

4b9b3361

Ответ 1

Сначала добавьте AVFoundation и MediaPlayer Framework, а затем вы можете использовать нижеприведенный код для обнаружения кнопки вверх/вниз,

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

Ответ 2

Для 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)

Затем добавьте эту функцию

func volumeChanged(notification: NSNotification) {

     if let userInfo = notification.userInfo {
        if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String {
            if volumeChangeType == "ExplicitVolumeChange" {
                // your code goes here
            }
        }
    }
}

Этот код обнаруживает явное действие изменения тома пользователем, как если бы вы не проверяли явное действие, эта функция будет автоматически вызываться периодически.

Этот код не мешает изменению объема системы

Ответ 3

для быстрого 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
                }
            }
        }
    }

....

Ответ 4

Хорошо, см. ссылки на службы аудиозаписей для получения дополнительной информации. Вам нужно запустить аудиозапись с помощью AudioSessionInitialize, а затем активировать ее с помощью AudioSessionSetActive, прослушать изменения в томе с помощью AudioSessionAddPropertyListener и передать обратный вызов с типом AudioSessionPropertyListener.

Этот веб-сайт имеет хорошую запись: http://fredandrandall.com/blog/2011/11/18/taking-control-of-the-volume-buttons-on-ios-like-camera/