iOS 6 ViewController вращается, но не должен

Я хочу, чтобы несколько контроллеров просмотра моего приложения не вращались в iOS 6.0. Вот что я сделал, чтобы сделать вращение в iOS 6 возможным:

1.) Установите Windows rootviewController в application:didFinishLaunchingWithOptions:

self.window.rootViewController = self.tabBarController;

2.) Установите «Поддерживаемые ориентации интерфейса» в моей цели (в XCode), чтобы я мог использовать все ориентации

3.) Реализована новая функция ротации iOS 6.0.

- (BOOL) shouldAutorotate {

    return YES;
}


-(NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskAll;
}

4.) По некоторым причинам я создал подкласс UINavigationController, реализовал также эти новые функции и использовал этот новый NavigationController вместо исходного.

Пока все хорошо, все работает нормально, и все контроллеры просмотра теперь могут поворачиваться в любую ориентацию. Теперь я хочу, чтобы несколько viewController не вращались и оставались только в портретном режиме. Но когда я устанавливаю новые методы поворота в этих конкретных контроллерах вида, как этот, он все равно поворачивается для каждой ориентации:

- (BOOL) shouldAutorotate {

    return NO;
}


-(NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskPortrait;
}

Кроме того, установка функции вращения навигационного контроллера, как указано выше, ничего не меняет. (Все контроллеры просмотра могут поворачиваться в любую ориентацию)

Что я делаю неправильно?

РЕДАКТИРОВАТЬ:

Также установка предпочтительной ориентации интерфейса ничего не меняет:

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {

    return UIInterfaceOrientationMaskPortrait;
}

person NicTesla    schedule 21.09.2012    source источник


Ответы (3)


Если вы хотите, чтобы все наши навигационные контроллеры соответствовали контроллеру вида сверху, вы можете использовать категорию. Я нашел это проще, чем подклассы.

@implementation UINavigationController (Rotation_IOS6)

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end
person Anthony    schedule 25.09.2012
comment
Будьте осторожны с этим решением - если метод supportInterfaceOrientations контроллера представления вызывает supportInterfaceOrientations на навигационном контроллере, то у вас бесконечная рекурсия. Я обнаружил трудный способ, которым Apple UIPrintingProgressViewController запрашивает навигационный контроллер для supportInterfaceOrientations... - person tyler; 20.11.2012
comment
@tyler Как мы позаботимся об этом? Печать приводит к бесконечной рекурсии. Никак не могу исправить. Я использовал вышеуказанную категорию для вращения определенных контроллеров представления в своем приложении. - person Angad Manchanda; 24.10.2013
comment
Короче говоря, не используйте категорию, управляйте поворотом в расширении UINavigationController. Поскольку вращение было настолько необычным в нашем приложении, самым простым для меня было использовать категорию UINav для явной блокировки поворота, а затем я создал расширение UINav, которое в основном делало бы то же, что и категория выше, если бы мне нужен стек навигации, допускающий вращение. - person tyler; 25.10.2013
comment
@tyler Итак, я создал подкласс UINavigationController и добавил к нему методы, теперь где мне использовать этот подкласс? Я хочу повернуть пару контроллеров представления в альбомную ориентацию в моем приложении и в plist, который у меня есть (портретная и альбомная ориентации включены) вместе с PRINT для работы. UIPrintingProgressViewController приводит к бесконечной рекурсии. Я застрял. - person Angad Manchanda; 25.10.2013
comment
@tyler Я понял. Создание подклассов работало без сбоев или бесконечных рекурсий в Print. Спасибо. - person Angad Manchanda; 25.10.2013

Это работает для меня:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return NO;
}
person Elendas    schedule 21.09.2012
comment
Спасибо за ваш быстрый ответ, но этот метод устарел в iOS 6. В iOS 6 вместо этого вы должны использовать два метода: shouldAutorotate и supportInterfaceOrientations. - person NicTesla; 21.09.2012

Вам нужно создать категорию UITabBarController для поддержки автоматического поворота

код файла .h такой

@interface UITabBarController (autoRotate)<UITabBarControllerDelegate>

    -(BOOL)shouldAutorotate;
    - (NSUInteger)supportedInterfaceOrientations;

@end

код файла .m как

-(BOOL)shouldAutorotate {

    AppDelegate *delegate= (AppDelegate*)[[UIApplication sharedApplication]delegate];
    return [delegate.tabBarController.selectedViewController shouldAutorotate];
}


- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

Примечание. Имя AppDelegate будет изменено на имя файла AppDelegate вашего проекта.

person Shreesh Garg    schedule 29.11.2012
comment
Спам, саморекламные ссылки также не приветствуются на Stack Overflow. - person Andrew Barber; 29.11.2012