감 아이폰 볼륨 버튼을 누르면?
-
12-12-2019 - |
문제
거기에 알리는 내가 들을 수 있는 것입니다 말할 때 아이폰의 볼륨 설정 올?
나는에 대해 알 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
다른 팁
이벤트를 원하는 경우 "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
}
}