簡體   English   中英

檢測iPhone音量按鈕按下?

[英]Detect iPhone Volume Button Up Press?

是否有一個通知,我能聽,會告訴我,當一個iPhone的音量開?

我知道AVSystemController_SystemVolumeDidChangeNotification ,但是僅在調高音量而不是調高音量時才觸發通知是必不可少的。

其次,如何隱藏按下音量調高按鈕時顯示的半透明視圖,以顯示系統的音量? Camera +已經實現了這一點。

如果需要事件,可以在“ outputVolume”屬性上注冊一個偵聽器:

- (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"]) {
        NSLog(@"volume changed!");
    }
}

沒有記錄到此的方法,但是您可以使用此替代方法。 注冊AVSystemController_SystemVolumeDidChangeNotification通知並添加MPVolumeView ,這將阻止顯示系統卷視圖。

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, 0, 10, 0)];
[volumeView sizeToFit];
[self.view addSubview:volumeView];

並且不要忘記開始音頻會話

AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(true);

在這種情況下, MPVolumeView對用戶隱藏。

至於檢查是否按了增大或減小音量,只需獲取當前應用程序的音量即可

float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume];  

並在通知回調中按下按鈕后將其與新音量進行比較

如果您不想自己做,可以在github中找到一個直接插入的類

https://github.com/blladnar/RBVolumeButtons

我通過為放置在MPVolumeView內的MPVolumeView添加自己的目標/動作來解決此問題。 因此可以捕獲音量變化事件並確定按下了哪個按鈕。 這是實現此方法的github回購 它在iOS 7及更高版本上正常運行,沒有棄用警告,也沒有被Apple拒絕。

為了區分音量動作: INSTEAD OF (在watchValue后衛中)

temp != 0.5

使用唯一卷起來

temp > 0.5

並且僅檢測音量降低:

temp < 0.5 

如果按下增大或減小音量,將打印以下解決方案。

import AVFoundation
import MediaPlayer

override func viewDidLoad() {
  super.viewDidLoad()
  let volumeView = MPVolumeView(frame: CGRect.zero)
  for subview in volumeView.subviews {
    if let button = subview as? UIButton {
      button.setImage(nil, for: .normal)
      button.isEnabled = false
      button.sizeToFit()
    }
  }
  UIApplication.shared.windows.first?.addSubview(volumeView)
  UIApplication.shared.windows.first?.sendSubview(toBack: volumeView)
}

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil)
  do { try AVAudioSession.sharedInstance().setActive(true) }
  catch { debugPrint("\(error)") }   
}

override func viewDidDisappear(_ animated: Bool) {
  super.viewDidDisappear(animated)
  AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume")
  do { try AVAudioSession.sharedInstance().setActive(false) } 
  catch { debugPrint("\(error)") }
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  guard let key = keyPath else { return }
  switch key {
    case "outputVolume":
      guard let dict = change, let temp = dict[NSKeyValueChangeKey.newKey] as? Float, temp != 0.5 else { return }
      let systemSlider = MPVolumeView().subviews.first { (aView) -> Bool in
        return NSStringFromClass(aView.classForCoder) == "MPVolumeSlider" ? true : false
      } as? UISlider
      systemSlider?.setValue(0.5, animated: false)
      guard systemSlider != nil else { return }
      debugPrint("Either volume button tapped.")
    default:
      break
  } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM