Как сделать запуск приложения в правильной ландшафтной ориентации без поворота на 180 ° при запуске?

У меня есть странная проблема с ландшафтным приложением. Он вращается только отлично до пейзажа влево или вправо, но когда приложение запускает его, оно поворачивается на 180 градусов вместо того, чтобы просто запускать в правильной ориентации.

Я сделал все, что мог найти в StackOverflow и Google. Информационный слой содержит:

enter image description hereenter image description here

Протестировано: iOS 7.1 полностью игнорирует начальную настройку ориентации запуска в plist. Я попробовал как влево, так и вправо, а затем удалил ключ из info plist. Нет эффекта. Приложение всегда запускается в альбомном режиме с помощью кнопки "Дом" слева, игнорируя эту настройку. enter image description here

При повторной попытке я удалю приложение и очищу сборку.

В App Delegate у меня есть это:

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

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

- (BOOL)shouldAutorotate {
    return YES;
}

В контроллере корневого представления:

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

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

- (BOOL)shouldAutorotate {
    return YES;
}

Некоторые ландшафтные приложения, такие как Tiny Wings, запускаются в правильной ориентации, поэтому я знаю, что что-то не так с моим проектом. Каков секретный соус, чтобы заставить это работать?

Ответ 1

Сначала вам не нужны три метода, которые у вас есть в AppDelegate, поскольку они предназначены для контроллеров и не будут вызваны в любом случае.

Вы можете реализовать application:supportedInterfaceOrientationsForWindow: (iOS 6+), хотя он говорит, что не нужно с правильными ключами в вашем Info.plist:

Обсуждение

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

Если вы не реализуете этот метод, приложение использует значения в Клавиша UIInterfaceOrientation приложений Info.plist по умолчанию ориентации интерфейса.

Но если ваша проблема связана с iOS 6+, я бы попробовал ее, поскольку это может быть ошибка Apple.

Также вы можете просто вернуть все ориентации в своих методах контроллера, чтобы это было просто.


В сумме:

  • Удалите методы, отправленные с вашего AppDelegate, они не будут вызваны.
  • Верните все ориентации в контроллеры.
  • Затем управляйте своими предпочтениями с помощью Info.plist (любая версия iOS).

Дополнительно, если проблемы сохраняются:

  • Попробуйте реализовать application:supportedInterfaceOrientationsForWindow: в вашем AppDelegate (только для iOS 6+), который вообще не нужен.

Ответ 2

iOS всегда запускает приложение в одну и ту же ориентацию интерфейса (первое, на что я заявляю приложение, я считаю), а затем поворачивается после запуска. Это предполагаемое поведение, поскольку оно упрощает некоторые аспекты развития.

Однако, я считаю, что ответ на этот вопрос - это решение, которое вы ищете: iOS: начальная ориентация интерфейса [UIInterfaceOrientation] игнорируется в plist

Ответ 3

В какой-то момент я получил ваш вопрос, это может помочь вам. Вы можете просто отметить режим ландшафта (справа/слева) в ориентации устройства в общих настройках. Tick orientation which you want

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

Ответ 4

Вам нужно изменить порядок значений для Supported interface orientations и Supported interface orientations (iPad). Итак, Landscape (right home button) должен идти первым, а Landscape (left home button) должен идти вторым в этих списках.

Кроме того, вы можете безопасно удалить Initial interface orientation из .plist. И эти три метода связаны с ориентацией ориентации интерфейса в AppDelegate и RootViewController.