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 ответа:
Отличный ответ Джонатана.
Я немного изменил его код, чтобы обработать навигационный контроллер в одном фрагменте.
- (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; }