Подтвердить что ты не робот

Формирование портретной ориентации при нажатии на альбомный режим.

Поддержка приложений: iOS6 +

Мое приложение работает как в портретной, так и в альбомной ориентации. Но 1 контроллер должен работать только в портрете.

Проблема в том, что когда я нахожусь в ландшафте и нажимаю контроллер просмотра, новый диспетчер представлений находится в ландшафте, пока я не поверну его к портрету. Затем он застрял в портрете, как и должно быть.

Можно ли всегда отображать его в портрете? Даже если его родитель нажимает на него в ландшафте?

Весь следующий код не помогает

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

И этот код работает до тех пор, пока я не вытащу из ландшафта Как заставить ориентацию UIViewController на портретную ориентацию в iOS 6

4b9b3361

Ответ 1

Я решил это, добавив следующие строки в ViewDidLoad

UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:c animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];

Ответ 2

Сначала вам нужно создать категорию:

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;
}