2015-12-18 3 views
5

Это, кажется, ошибка ОС, но обходной путь по-прежнему необходим.Список маршрутов MPVolumeView поддерживает все ориентации и игнорирует основной контроллер представления

Ориентация на iOS 8 или 9, используя ориентацию на основе контроллера, список маршрутов MPVolumeView всегда будет вращаться, даже если его родительский контроллер просмотра поддерживает только одну ориентацию.

Это может привести к тому, что система попадет в неправильное состояние ориентации, когда контроллер просмотра отображается на портрете, но строка состояния (и центр управления) является альбомной.

Создал тестовый проект, который демонстрирует ошибку: https://github.com/NextFaze/MPVolumeViewTest

+0

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

ответ

1

Hacky решения с использованием 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