ios - home - cómo hacer una captura de pantalla en iphone 5
La forma más limpia de capturar el botón de subir/bajar volumen en iOS 8 (5)
¿Cuál es la forma mejor / más limpia de capturar los botones de subir / bajar volumen en iOS 8 ?
Idealmente, me gustaría capturar la pulsación de tecla y también evitar que el volumen del sistema cambie (o, al menos, evitar que el HUD cambie el volumen).
Hay algunas respuestas antiguas que utilizan métodos desaprobados y no parecen funcionar en absoluto en iOS 8. Este iOS 8 específico tampoco funcionó.
Esta clase de código abierto de RBVolumeButtons tampoco parece funcionar en iOS 8.
Ah, de acuerdo, consulte las referencias de servicios de sesión de audio para obtener más información Debe iniciar una sesión de audio con AudioSessionInitialize y luego activarlo con AudioSessionSetActive, escuchar los cambios en el volumen con AudioSessionAddPropertyListener y pasar una devolución de llamada que tenga el tipo AudioSessionPropertyListener.
Este sitio web tiene una buena redacción: http://fredandrandall.com/blog/2011/11/18/taking-control-of-the-volume-buttons-on-ios-like-camera/
Para Swift puedes usar el siguiente código en tu clase viewController:
let volumeView = MPVolumeView(frame: CGRectMake(-CGFloat.max, 0.0, 0.0, 0.0))
self.view.addSubview(volumeView)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(volumeChanged(_:)), name: "AVSystemController_SystemVolumeDidChangeNotification", object: nil)
Entonces agrega esta función
func volumeChanged(notification: NSNotification) {
if let userInfo = notification.userInfo {
if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String {
if volumeChangeType == "ExplicitVolumeChange" {
// your code goes here
}
}
}
}
Este código detecta la acción de cambio de volumen explícita por parte del usuario, como si no verificara la acción explícita, esta función se llamará automáticamente de forma periódica.
Este código no impide el cambio de volumen del sistema.
Primero agregue AVFoundation y MediaPlayer Framework y luego puede usar el siguiente código para detectar los botones de subir / bajar,
-(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"]) {
float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume];
NSLog(@"volume changed! %f",volumeLevel);
}
}
Versión Objective-C (mediante notificaciones):
#import <MediaPlayer/MPVolumeView.h>
#import <AVFoundation/AVFoundation.h>
@interface ViewController () {
UISlider *volumeViewSlider;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self startTrackingVolumeChanges];
}
- (void)dealloc
{
[self stopTrackingVolumeChanges];
}
#pragma mark - Start Tracking Volume Changes
- (void)startTrackingVolumeChanges
{
[self setupVolumeViewSlider];
[self addObserver];
[self activateAudioSession];
}
- (void)setupVolumeViewSlider
{
MPVolumeView *volumeView = [[MPVolumeView alloc] init];
for (UIView *view in [volumeView subviews]) {
if ([view.class.description isEqualToString:@"MPVolumeSlider"]) {
volumeViewSlider = (UISlider *)view;
break;
}
}
}
- (void)addObserver
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
}
- (void)activateAudioSession
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
NSError *error;
BOOL success = [audioSession setActive:YES error:&error];
if (!success) {
NSLog(@"Error activating audiosession: %@", error);
}
}
#pragma mark - Observing Volume Changes
- (void)volumeChanged:(NSNotification *)notification
{
NSString *volumeChangeType = notification.userInfo[@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"];
if ([volumeChangeType isEqualToString:@"ExplicitVolumeChange"]) {
float volume = volumeViewSlider.value;
NSLog(@"volume = %f", volume);
}
}
#pragma mark - Stop Tracking Volume Changes
- (void)stopTrackingVolumeChanges
{
[self removeObserver];
[self deactivateAudioSession];
volumeViewSlider = nil;
}
- (void)removeObserver
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
}
- (void)deactivateAudioSession
{
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error;
BOOL success = [[AVAudioSession sharedInstance] setActive:NO error:&error];
if (!success) {
NSLog(@"Error deactivating audiosession: %@", error);
}
});
}
@end
para swift 3: (recuerde agregar: importar MediaPlayer ..)
override func viewDidLoad() {
super.viewDidLoad()
let volumeView = MPVolumeView(frame: CGRect(x: 0, y: 40, width: 300, height: 30))
self.view.addSubview(volumeView)
// volumeView.backgroundColor = UIColor.red
NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged(notification:)),
name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"),
object: nil)
}
func volumeChanged(notification: NSNotification) {
if let userInfo = notification.userInfo {
if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String {
if volumeChangeType == "ExplicitVolumeChange" {
// your code goes here
}
}
}
}
....