Détecter iPhone Bouton de Volume, Appuyez sur?
-
12-12-2019 - |
Question
Est-il un avis que je peux l'écouter me dira quand un iPhone est le volume est activé jusqu'?
Je sais que sur le AVSystemController_SystemVolumeDidChangeNotification
, mais il est essentiel que la notification ne se déclenchera que lorsque le volume a été tourné vers le haut, pas vers le haut ou vers le bas.
Deuxièmement, comment puis-je cacher la translucides de la vue qui s'affiche lorsque le volume est enfoncé, montrant le système de volume? Caméra+ a mis en œuvre cette.
La solution
Il n'est pas documentée de manière à cela, mais vous pouvez utiliser cette solution de contournement.Pour vous inscrire AVSystemController_SystemVolumeDidChangeNotification
de notification et d'ajouter un MPVolumeView
qui empêchera le volume de système de vue d'apparaître.
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, 0, 10, 0)];
[volumeView sizeToFit];
[self.view addSubview:volumeView];
Et n'oubliez pas de commencer une Session Audio
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(true);
Dans Ce cas, l' MPVolumeView
est caché à l'utilisateur.
Comme pour le contrôle de volume vers le haut ou vers le bas a été pressé, il suffit de saisir l'application actuelle du volume
float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume];
et le comparer avec le nouveau volume après que le bouton a été pressé dans la notification de rappel
Si vous ne voulez pas le faire vous-même, il y a une baisse dans la catégorie disponibles sur github
Autres conseils
Si vous voulez un événement vous pouvez enregistrer un listener sur le "outputVolume de la propriété":
- (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!");
}
}
J'ai résolu ce problème en ajoutant propre cible/action pour UISlider placé à l'intérieur de MPVolumeView
.Il est donc possible de prendre du volume événements de changement et de déterminer quel bouton a été pressé.Voici dépôt github avec la mise en œuvre de cette approche.Il fonctionne bien avec iOS 7 et ci-dessus, aucune dépréciation des avertissements et pas de rejet de la part de Apple.
Afin de distinguer le volume de l'action: AU LIEU DE (en observeValue de la garde)
temp != 0.5
UTILISATION pour seul volume
temp > 0.5
et seulement de détecter le volume vers le bas:
temp < 0.5
Cette solution ci-dessous sera imprimée si le volume vers le haut ou vers le bas sont pressés.
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
}
}