2015-12-18 43 views
5

Questo sembra essere un errore del sistema operativo, ma è ancora necessaria una soluzione.L'elenco dei percorsi MPVolumeView supporta tutti gli orientamenti e ignora il controller della vista sottostante

Targeting iOS 8 o 9, utilizzando l'orientamento basato sul controller di visualizzazione, l'elenco di rotte di MPVolumeView ruoterà sempre, anche se il controller della vista principale supporta solo un orientamento singolo.

Ciò può causare il sistema in uno stato di orientamento errato in cui il controller di visualizzazione viene visualizzato in verticale, ma la barra di stato (e il centro di controllo) sono orizzontali.

hanno creato un progetto di test che dimostra l'errore: https://github.com/NextFaze/MPVolumeViewTest

+0

https://openradar.appspot.com/radar?id=4974311702003712 –

risposta

1

soluzione hacky utilizzando swizzling:

#import "UIViewController+RoutingSheet.h" 
#import <objc/runtime.h> 

@implementation UIViewController (RoutingSheet) 

+ (void)load { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     SEL originalSelector = @selector(shouldAutorotate); 
     SEL swizzledSelector = @selector(shouldAutoRotateOverrideRoutingSheet); 
     Method originalMethod = class_getInstanceMethod(self, originalSelector); 
     Method extendedMethod = class_getInstanceMethod(self, swizzledSelector); 
     method_exchangeImplementations(originalMethod, extendedMethod); 
    }); 
} 

- (UIWindow *)currentWindow { 
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) { 
     if (window.rootViewController == self) 
      return window; 
    } 
    return nil; 
} 

- (BOOL)shouldAutoRotateOverrideRoutingSheet { 
    UIWindow *window = [self currentWindow]; 
    if (window != nil) { 
     NSString *className = NSStringFromClass(window.class); 
     if ([className containsString:@"MPAVRoutingSheetSecureWindow"]) { 
      return NO; 
     } 
    } 
    return [self shouldAutoRotateOverrideRoutingSheet]; 
} 

@end