2014-06-25 4 views
1

Я разрабатываю приложение, которое использует стороннюю библиотеку, которая представляет свой собственный контроллер представления. Все, что доступно для меня, это библиотека .a и заголовочный файл. Мое приложение работает только в портретном режиме, но когда у меня есть телефон в альбомной ориентации и отображается диспетчер представлений из библиотеки, приложение отключается с сообщением об ошибке:Переопределить свойство авторотации третьей стороны ViewController

«Поддерживаемая ориентация не соответствует ориентации приложения».

Я думаю, что они написали следующий код:

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 

    // ATTENTION! Only return orientation MASK values 
    // return UIInterfaceOrientationPortrait; 

    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeLeft; 
} 

Если это так, то я, вероятно, необходимо переопределить эти методы, чтобы сообщить ОС не вращаться, и что только портрет поддерживается. Как я могу это сделать?

Единственная возможность, о которой я могу думать, - это подгонять метод для этого контроллера вида, но это похоже на опасный подход в соответствии с несколькими сообщениями SO.

+0

Возможный дубликат [в iOS7 как остановить первый просмотр управления авторотированием?] (Http://stackoverflow.com/questions/24239641/in-ios7-how-do-you-stop-the-first-viewcontroller- autorotating) – holex

ответ

2

Вы всегда можете сделать следующее (в качестве примера блокирования ViewController в портретном режиме):

1) Установка в свойстве файла заголовок делегата приложения ... @property (nonatomic) BOOL lockScreenPortraitOnly;

2) В файл реализации приложения делегат добавить следующий метод:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindows:(UIWindow *)window 
{ 
    if (!self.lockScreenPortraitOnly) 
     return UIInterfaceOrientationMaskAll; // or, whatever you wish to support 
    else 
     return UIInterfaceOrientationMaskPortrait; 
} 

3) Изнутри вашего ViewController добавить следующее:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    ((EliotsApplicationDelegateType *)[UIApplication sharedApplication].delegate).lockScreenPortraitOnly = YES; 
} 

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    ((EliotsApplicationDelegateType *)[UIApplication sharedApplication].delegate).lockScreenPortraitOnly = NO; 
} 

Теперь не имеет значения, что находится в Plist или что делает сторонняя библиотека, поскольку «окно» является самым корневым, и, как таковое, оно контролирует все остальное в иерархии. Очевидно, что в моем примере предполагается, что ваш VC вызывается до того, как ваш сторонний библиотечный код будет разворачиваться (отрегулируйте, приправьте и испеките по мере необходимости).

Надеюсь, это поможет.

1

Я бы сказал, продолжайте и изучите его. Вам нужно быть осторожным при обновлении библиотеки, чтобы протестировать этот конкретный элемент. Опасность в swizzling обычно сопровождается зависанием API-интерфейсов Apple, поскольку они могут быть устаревшими или их поведение изменилось при любом выпуске (что впоследствии может сломать ваше приложение для пользователей).

Смежные вопросы