Ответ 1
Я решил это, добавив следующие строки в ViewDidLoad
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:c animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
Поддержка приложений: iOS6 +
Мое приложение работает как в портретной, так и в альбомной ориентации. Но 1 контроллер должен работать только в портрете.
Проблема в том, что когда я нахожусь в ландшафте и нажимаю контроллер просмотра, новый диспетчер представлений находится в ландшафте, пока я не поверну его к портрету. Затем он застрял в портрете, как и должно быть.
Можно ли всегда отображать его в портрете? Даже если его родитель нажимает на него в ландшафте?
Весь следующий код не помогает
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
И этот код работает до тех пор, пока я не вытащу из ландшафта Как заставить ориентацию UIViewController на портретную ориентацию в iOS 6
Я решил это, добавив следующие строки в ViewDidLoad
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:c animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
Сначала вам нужно создать категорию:
UINavigationController + Rotation_IOS6.h
#import <UIKit/UIKit.h>
@interface UINavigationController (Rotation_IOS6)
@end
UINavigationController + Rotation_IOS6.m:
#import "UINavigationController+Rotation_IOS6.h"
@implementation UINavigationController (Rotation_IOS6)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
@end
Затем вы реализуете эти методы в своем классе, которые вы хотите быть только ландшафтными:
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
Если вы используете UITabBarController, просто замените UINavigationController для UITabBarController. Это решение сработало хорошо после длительного поиска! Я был в той же ситуации, что и сейчас!
ИЗМЕНИТЬ
Итак, я увидел ваш образец. Вам нужно внести некоторые изменения.
1 - Создайте новый класс для категории UINavigationController. Назовите класс UINavigationController + Rotation_IOS6 (.h и .m)
2 - Вам не нужно реализовывать метод preferredInterfaceOrientationForPresentation
. Ваша категория должна выглядеть так:
#import "UINavigationController+Rotation_IOS6.h"
@implementation UINavigationController (Rotation_IOS6)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
@end
3 - В классе, который вы хотите повернуть только в ландшафте, включите его в реализацию, точно так же:
// Rotation methods for iOS 6
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
4 - Я бы посоветовал также включить метод авторотации для iOS 5 внутри класса, который вы хотите в ландшафте:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}