iOS6: supportedInterfaceOrientations не работает (вызывается, но интерфейс по-прежнему вращается)

В моем приложении у меня несколько просмотров, некоторые представления должны поддерживать как портрет, так и пейзаж, в то время как другие представления должны поддерживать только портрет. Таким образом, в резюме проекта я выбрал все ориентации.

Приведенный ниже код работал, чтобы отключить ландшафтный режим на данном контроллере представления до iOS 6:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } 

Поскольку shouldAutorotateToInterfaceOrientation устарел в iOS6, я заменил выше:

 -(NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMask.Portrait; } 

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

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

Если вы используете UINavigationController в качестве корневого контроллера окон , это будет его shouldAutorotate & supportedInterfaceOrientations который будет вызываться.

То же самое , если вы используете UITabBarController и т. Д.

Поэтому нужно подклассифицировать ваш контроллер навигации / панели управления и переопределить методы shouldAutorotate & supportedInterfaceOrientations .

попробуйте изменить этот код в AppDelegate.m

 // self.window.rootViewController = self.navigationController; [window setRootViewController:navigationController]; 

это полный ответ

shouldAutorotateToInterfaceOrientation не вызывается в iOS 6

XD

В моем случае у меня есть UINavigationController и мой контроллер просмотра внутри. Мне пришлось подклассифицировать UINavigationController и, чтобы поддерживать только портрет, добавьте этот метод:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; } 

Поэтому в подклассе UINavigationController мне нужно проверить, какая ориентация поддерживается текущим topViewController.

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

Одна вещь, которую я нашел, – это если у вас есть старое приложение, которое все еще выполняется

 [window addSubView:viewcontroller.view]; //This is bad in so may ways but I see it all the time... 

Вам необходимо будет обновить это, чтобы:

 [window setRootViewController:viewcontroller]; //since iOS 4 

Как только вы это сделаете, ориентация должна снова начать работать.

Лучший способ для iOS6 определен в «iOS6 by Tutorials» командой Ray Wenderlich – http://www.raywenderlich.com/ и лучше, чем в большинстве случаев подклассифицировать UINavigationController.

Я использую iOS6 с раскадрой, которая включает в себя UINavigationController, установленный в качестве начального контроллера представления.

//AppDelegate.m – этот метод недоступен до iOS6, к сожалению

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown; if(self.window.rootViewController){ UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject]; orientations = [presentedViewController supportedInterfaceOrientations]; } return orientations; } 

//MyViewController.m – возвращает любые ориентации, которые вы хотите поддерживать для каждого UIViewController

 - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait; } 

Как указано другими, если вы используете UINavigationController и хотите настроить различные представления, вы захотите подклассифицировать UINavigationController и убедиться, что у вас есть эти два компонента:

 @implementation CustomNavigationController // ------------------------------------------------------------------------------- // supportedInterfaceOrientations: // Overridden to return the supportedInterfaceOrientations of the view controller // at the top of the navigation stack. // By default, UIViewController (and thus, UINavigationController) always returns // UIInterfaceOrientationMaskAllButUpsideDown when the app is run on an iPhone. // ------------------------------------------------------------------------------- - (NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } // ------------------------------------------------------------------------------- // shouldAutorotate // Overridden to return the shouldAutorotate value of the view controller // at the top of the navigation stack. // By default, UIViewController (and thus, UINavigationController) always returns // YES when the app is run on an iPhone. // ------------------------------------------------------------------------------- - (BOOL)shouldAutorotate { return [self.topViewController shouldAutorotate]; } 

Затем, во всяком случае, это только портрет, который вы бы включили:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

И в любом случае это все, кроме перевернутого:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAllButUpsideDown; } 

В основном, как указано выше, но более подробно:

  1. Создайте новый файл, который является подклассом UINavigationController
  2. Перейдите в свою раскадровку и затем нажмите на контроллер навигации, установите ее класс в тот, который вы только что создали.
  3. В этом классе (.m файл) добавьте следующий код, чтобы он оставался в портретном режиме:

     (BOOL)shouldAutorotate { return NO; } (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

Это сработало для меня

Этот код работал для меня:

 -(BOOL)shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; } 

iPhone / iPad App Orientation проверить мой собственный ответ

Лучший способ, по-моему, сделать категорию, а не подклассифицировать UINavigationController или UITabbarController

ваш UINavigationController + Rotation.h

 #import <UIKit/UIKit.h> @interface UINavigationController (Rotation) @end 

ваш UINavigationController + Rotation.m

 #import "UINavigationController+Rotation.h" @implementation UINavigationController (Rotation) -(BOOL)shouldAutorotate { return [[self.viewControllers lastObject] shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [[self.viewControllers lastObject] supportedInterfaceOrientations]; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; } @end 

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

Попробуйте добавить метод shouldAutorotate

Во-первых, чтобы заставить приложение работать только в режиме, вы должны возвращать UIInterfaceOrientationMaskLandscape . Если вы хотите сохранить только портретный режим, вы делаете все правильно.

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

Кроме того, вы должны возвращать false из shouldAutoRotate если вы хотите полностью избежать автоматического поворота. Но я предлагаю вам вернуться отсюда и указать правильные ориентации в методе supportedInterfaceOrientations .

У меня такая же ситуация, как и вы. Я знаю, что вы уже приняли ответ, но я думал, что добавлю еще один. Так я понимаю, что новая версия системы ротации работает. Контроллер корневого представления является единственным контроллером вида, который когда-либо будет вызван. Я считаю, что аргументация заключается в том, что с контроллерами дочерних элементов часто не имеет смысла поворачивать свои представления, так как они все равно останутся в рамках контроллера корневого представления.

Итак, что происходит. Сначала shouldAutorotate быть shouldAutorotate на контроллере корневого представления . Если NO возвращается, все останавливается. Если YES то вызывается метод supportedInterfaceOrientations . Если ориентация интерфейса подтверждена в этом методе и глобально поддерживаемых ориентациях от Info.plist или делегата приложения, тогда представление будет вращаться. Перед вращением shouldAutomaticallyForwardRotationMethods метод shouldAutomaticallyForwardRotationMethods . Если YES (по умолчанию), то все дети получат методы will и didRotateTo... а также родительский (и они, в свою очередь, отправят их своим детям).

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

Если вы используете UINavigationController , вам необходимо реализовать shouldAutorotate и supportedInterfaceOrientations в подклассе UINavigationController .

Они могут управляться двумя шагами, если shouldAutorotate возвращает YES, а затем эффективную supportedInterfaceOrientations . Это очень приятная комбинация.

В этом примере мои главные представления – «Портрет», кроме CoverFlowView и PreviewView. Передача CoverFlowView в PreviewView, PreviewView хочет следовать за поворотом CoverFlowCView.

 @implementation MyNavigationController -(BOOL)shouldAutorotate { if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"PreviewView")]) return NO; else return YES; } -(NSUInteger)supportedInterfaceOrientations { if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"CoverFlowView")]) return UIInterfaceOrientationMaskAllButUpsideDown; else return UIInterfaceOrientationMaskPortrait; } ... @end 

мое решение: window.rootViewController UINavigationController и установить его как window.rootViewController

верхний viewcontroller иерархии будет управлять ориентацией, некоторые примеры кода: подклассы UINavigationController

Ответы здесь указывали мне в правильном направлении, хотя я не мог заставить его работать, просто вырезая и вставляя, потому что я использую UINavigationControllers внутри UITabBarController. Поэтому моя версия в AppDelegate.m выглядит примерно так, что будет работать для UITabBarControllers, UINavigationControllers или UINavigationControllers в UITabBarController. Если вы используете другие пользовательские контроллеры сдерживания, вам нужно будет добавить их здесь (что является вроде обломка).

 - (UIViewController*)terminalViewController:(UIViewController*)viewController { if ([viewController isKindOfClass:[UITabBarController class]]) { viewController = [(UITabBarController*)viewController selectedViewController]; viewController = [self terminalViewController:viewController]; } else if ([viewController isKindOfClass:[UINavigationController class]]) { viewController = [[(UINavigationController*)viewController viewControllers] lastObject]; } return viewController; } - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { NSUInteger orientations = UIInterfaceOrientationMaskPortrait; UIViewController* viewController = [self terminalViewController:window.rootViewController]; if (viewController) orientations = [viewController supportedInterfaceOrientations]; return orientations; } 

Еще одна важная вещь, которую следует отметить, заключается в том, что вы должны переопределить supportedInterfaceOrientations в своих подклассах UIViewController или по умолчанию будет указано то, что вы указали в своем Info.plist.

  • проблема с Facebook iOS SDK v 3.1.1
  • Цель C UIColor для NSString
  • iOS 6/7 Deltas: Работает только для подзаголовков?
  • Поддержка iOS 4.3 до iOS 6.0
  • Использование addConnectionForRelationship для массива идентификаторов
  • Пропорциональные ограничения расстояния в макете
  • Прочтите настройки iPhone программно (точно настройки-> Общие-> Дата и время-> Установить автоматически)
  • Цвет фона в виде таблицы групп устарел в ios 6.0
  • UICollectionViewController - иногда показывает неправильные ячейки, во время быстрой прокрутки
  • Как обрезать видео?
  • UITextView - настройка размера шрифта attribitedText медленно?
  • Interesting Posts

    Как получить ссылку на UIPopoverController при использовании адаптивного segue?

    Представление «прыгает», когда я добавляю его в UIWindow как subview (через свойство rootViewController) и делаю флип

    значения iOS не совпадают

    Есть ли способ перечислить все swizzled методы в приложении iOS?

    Swift 2.1 – Использование UITableView для одной ячейки

    Соотношения многопоточных хранилищ данных

    Окно входа в систему SSO возвращается в fbDidNotLogin без указания ошибки

    Общение между iPhone и Mac

    Пользовательский заголовок таблицы TableView перекрывает ячейки представления таблицы

    Обнаружение изменений файла в каталоге документов

    Как перенести ярлык и изменить его с помощью автоматического макета?

    Проверьте подключение к Интернету в приложении iOS с телефоном Phone Phone 3.0.

    Как оптимизировать рендеринг большой модели в OpenGL ES 1.1?

    Можем ли мы обмениваться видео с внешней камеры на устройство iOS

    Ошибки, пытающиеся использовать AdWhirl с Admob

    Давайте будем гением компьютера.