是否有我可以收听的通知,该通知会在 iPhone 音量打开时告诉我 向上?

我知道关于 AVSystemController_SystemVolumeDidChangeNotification, ,但重要的是,只有在调高音量时才触发通知,而不是调高或调低音量。

其次,如何隐藏按下音量增大按钮时出现的显示系统音量的半透明视图? 相机+ 已经实施了这一点。

有帮助吗?

解决方案

没有记录的方法,但您可以使用此解决方法。注册生成的AVSystemController_SystemVolumeDidChangeNotification通知并添加一个生成的icotagcode,它会阻止系统卷视图显示出来。

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

其他提示

如果您想要一个事件,您可以在“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!");
    }
}
.

我通过为放置在其中的 UISlider 添加自己的目标/操作解决了这个问题 MPVolumeView. 。因此可以捕获音量变化事件并确定按下了哪个按钮。这是 github 仓库 随着这种方法的实施。它在 iOS 7 及更高版本上运行良好,没有弃用警告,也没有遭到 Apple 的拒绝。

为了区分体积动作:而不是(在observevalue guard中)

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归因
不隶属于 StackOverflow
scroll top