Почему начальная ориентация ViewController не является альбомной, когда она должна быть? - PullRequest
3 голосов
/ 20 ноября 2011

Я создаю приложение, которое поддерживает только альбомный режим устройства iOS.Поэтому я установил, чтобы он возвращал только YES для UIInterfaceOrientationLandscapeRight и UIInterfaceOrientationLandscapeLeft в shouldAutorotateToInterfaceOrientation: и устанавливал начальную ориентацию в Info.plist на UIInterfaceOrientationLandscapeRight.Приложение отображается нормально.

Проблема в том, что система координат не находится в альбомной ориентации, пока не закончится загрузка вида (я не особенно уверен, когда она применяется правильно).Что я знаю, так это то, что он меняется на правильное координатное пространство при вызове: shouldAutorotateToInterfaceOrientation при запуске.Проблема в том, что когда вызываются и viewDidLoad, и initWithCoder:, то они находятся в неправильном координатном пространстве перед shouldAutorotate....

Я имею в виду, что если я установлю представление на полную ширинуЭкран с CGRectMake(0, 0, 480, 320) (вместо использования self.view.frame или чего-то еще) скрывается, когда координатные пространства повернуты «исправлено».Для видов, созданных в viewDidLoad, применяется вращение, поэтому они ошибочны.Это делает настройку представлений в этих методах болезненной и действительно нелогичной.Я предполагаю, что это проблема того, как обрабатываются ориентации.Почему это ведет себя так?Я всячески говорил, что хочу только альбомную позицию.Может ли это быть что-то с Интерфейсный конструктор и свойства там?

Это использует стандарт UIViewController.Однако новые представления также загружаются из файлов .xib в viewDidLoad.Может ли это быть проблемой?

Ответы [ 3 ]

8 голосов
/ 18 декабря 2012

Поддержка изменений ориентации - это то, с чем все разработчики iOS сталкиваются в тот или иной момент. Это часто сбивает с толку и расстраивает. Вот эмпирическое правило, которое решит 95% всех проблем с ориентацией:

Изменения интерфейса, связанные с ориентацией (например, изменение размера кадра), не происходят до viewWillAppear:. До тех пор ваш вид будет в портретном режиме , даже если вы поддерживаете только альбомную ориентацию в своем приложении или ваше приложение уже находится в альбомной ориентации .

Поскольку viewDidLoad: встречается до viewWillAppear:, изменения в ориентации еще не произошли. Таким образом, выполнение любого из следующих действий в viewDidLoad часто приводит к неожиданным результатам (в зависимости от того, как установлено autoResize представления):

  • вставка слоя (такого как градиент) внутри представления с рамкой, равной границам представления. Вставленный слой всегда будет размером с вид в портретном режиме. Если этот вид растягивается при повороте на альбомный вид, ваш слой будет меньше, чем вид.
  • пытается определить размер табличного представления и использует этот фрейм для какого-то другого представления
  • добавление дочернего контроллера представления вручную и использование рамки контейнера для определения рамки просмотра дочернего контроллера представления.
1 голос
/ 21 ноября 2011

Я только что прочитал сегодня документацию UIViewController, и я помню, как читал об этом.

В разделе обзора «Обработка видов вращения»:

По умолчанию класс UIViewController отображает представления только в портретном режиме. Для поддержки дополнительных ориентаций необходимо переопределить метод shouldAutorotateToInterfaceOrientation: и вернуть YES для любых ориентаций, поддерживаемых вашим подклассом. Если свойства автоматического изменения размеров ваших представлений настроены правильно, это может быть все, что вам нужно сделать. Однако класс UIViewController предоставляет дополнительные возможности для реализации дополнительных действий по мере необходимости.

...

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

http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW57

Единственное, о чем я могу подумать, это может вызвать дополнительные проблемы, если вы устанавливаете опции autoresizingMask в своих подпредставлениях. Могло бы затруднить прогнозирование того, что произойдет, когда представление будет повернуто и изменено в размерах, очень сложно, если все ваши числа неверны.

Если вы используете пользовательские UIVIews, вы можете переопределить layoutSubviews: для обработки разного времени, когда может потребоваться повторная компоновка подпредставлений (или когда вы вызываете setNeedsLayout).

0 голосов
/ 04 декабря 2011

Вы можете изменить порядок Поддерживаемых ориентаций интерфейса в файле [project] -info.plist, установить для элемента 0 значение Пейзаж (правая домашняя кнопка).

...