문제

거기에 알리는 내가 들을 수 있는 것입니다 말할 때 아이폰의 볼륨 설정 ?

나는에 대해 알 AVSystemController_SystemVolumeDidChangeNotification, 지만,하는 것이 필수적입니다 알리는 트리거 될 때의 볼륨을 설정하지 않습니다.

둘째,어떻게 숨기는 투명기 때 나타나는 볼륨 최대 버튼을 누르면을 보여주는 시스템의 볼륨? 카메라 가 구현한다.

도움이 되었습니까?

해결책

이 없는 문서화하는 방법이 사용할 수 있지만 이 해결 방법입니다.등록 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

다른 팁

이벤트를 원하는 경우 "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!");
    }
}
.

MPVolumeView 내부에 배치 된 UISlider에 대한 자체 대상 / 조치를 추가 하여이 문제를 해결했습니다.따라서 볼륨 변경 이벤트를 잡고 버튼을 누른 버튼을 결정할 수 있습니다. Github Repo 이 접근 방식을 구현할 수 있습니다. 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