iOS 6 Tab Bar App: shouldAutorotate не работает


Я моментально разрабатываю приложение с панелью вкладок и некоторыми контроллерами навигации в раскадровке, используя iOS 6 и Xcode 4.5

Обычно приложение должно поддерживать все ориентации интерфейса, но у меня есть два вида, которые должны поддерживать только портретный режим.

Поэтому я добавил следующий код к контроллерам вида:

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationPortrait;
}

На другом приложении, которое я разработал без раскадровки и навигационного контроллера вида на iOS 6, это работает, но ее нет! : /

Я надеюсь, что кто-то может помочь, потому что я нашел какой-то другой пост, который мне не помог...

С наилучшими пожеланиями от Германии

Laurenz

Редактировать:

Я тоже пробовал - не получается! :

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;

} 
2 3

2 ответа:

Отличный ответ Джонатана.

Я немного изменил его код, чтобы обработать навигационный контроллер в одном фрагменте.

- (BOOL)shouldAutorotate {
    if (self.selectedViewController) {
        if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
            return [[[(UINavigationController*)self.selectedViewController viewControllers] lastObject] shouldAutorotate];
        }
        return [self.selectedViewController shouldAutorotate];
    } else {
        return YES;
    }
}

- (NSUInteger)supportedInterfaceOrientations {
    if (self.selectedViewController) {
        if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
            return [[[(UINavigationController*)self.selectedViewController viewControllers] lastObject] supportedInterfaceOrientations];
        }
        return [self.selectedViewController supportedInterfaceOrientations];
    } else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
} 

Насколько я могу судить, эта проблема возникает потому, что UITabBarController и UINavigationController возвращают свои собственные значения по умолчанию для -(BOOL)shouldAutorotate и -(NSUInteger)supportedInterfaceOrientations.

Одним из решений является расширение обоих этих классов через категории (или просто подкласс), чтобы вернуть соответствующие значения из ваших собственных реализаций этих методов в контроллере представления. Это то, что сработало для меня (вы можете просто бросить это в свое приложение Делегат):

@implementation UITabBarController(AutorotationFromSelectedView)

- (BOOL)shouldAutorotate {
    if (self.selectedViewController) {
        return [self.selectedViewController shouldAutorotate];
    } else {
        return YES;
    }
}

- (NSUInteger)supportedInterfaceOrientations {
    if (self.selectedViewController) {
        return [self.selectedViewController supportedInterfaceOrientations];
    } else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}

@end

@implementation UINavigationController(AutorotationFromVisibleView)

- (BOOL)shouldAutorotate {
    if (self.visibleViewController) {
        return [self.visibleViewController shouldAutorotate];
    } else {
        return YES;
    }
}

- (NSUInteger)supportedInterfaceOrientations {
    if (self.visibleViewController) {
        return [self.visibleViewController supportedInterfaceOrientations];
    } else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}
@end

По умолчанию все ваши контроллеры вида будут продолжать авторотацию. В двух контроллерах вида, которые должны поддерживать только портретный режим, реализуйте следующее:

-(BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}