deleted-mezhevikin
@deleted-mezhevikin

Проблема с ориентацией экрана?

02656d05d4e5333574ee7a5c6610f8c9.png


Есть два контроллера FirstViewController и SecondViewController они в NavigationController.

Нужно чтобы FirstViewController был только в портретной ориентации, а SecondViewController во всех.


Пробовал так:

В NavigationController добавил
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}



А в SecondViewController
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
}



в plist
<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>


Что упускаю?
  • Вопрос задан
  • 3072 просмотра
Решения вопроса 1
deleted-mezhevikin
@deleted-mezhevikin Автор вопроса
Как сказал timokhin информация о ориентации берется из корневого контроллера, если у вас корень это navigationController, то создаем класс и наследуем его от UINavigationController.
Добавляем три метода которые берут значение из верхнего контроллера:

//
//  NavigationController.h
//

#import <UIKit/UIKit.h>

@interface NavigationController : UINavigationController

@end


//
//  NavigationController.m
//

#import "NavigationController.h"

@implementation NavigationController

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

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

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

@end


теперь в самих вьюконтроллерах начнут работать методы
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
	return YES;
}


У меня например, в корне кастомный таббарконтроллер, а в нем уже контроллеры завернутые в UINavigationController, я добавил методы:

- (BOOL)shouldAutorotate
{
    UIViewController *viewController = [(UINavigationController *)self.selectedViewController topViewController];
    return [viewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
    UIViewController *viewController = [(UINavigationController *)self.selectedViewController topViewController];
    return [viewController  supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
     UIViewController *viewController = [(UINavigationController *)self.selectedViewController topViewController];
    return [viewController preferredInterfaceOrientationForPresentation];
}


с стандартным UITabBarController думаю будет так же
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
timokhin
@timokhin
iOS developer
Сам не пробовал, но, судя по документации, эти методы будут работать только в случае:

-(BOOL)shouldAutorotate{
    return YES;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы