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

Как мы определяем ориентацию приложения в iOS 8?

В iOS 7 мы сказали:

// ViewController1:

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotate {
    return YES;
}

// ViewController2, presented by modal segue from button in ViewController1

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate {
    return YES;
}

В результате оказалось, что приложение появилось в ландшафтном представлении контроллера 1 и в портрете в виде контроллера 2.

Этот код отлично работает в iOS 7, включая симуляторы iOS 7 в Xcode 6. Но он больше не работает в iOS 8. Есть две проблемы:

  • Вид View Controller 1 отображается в ландшафте, но симулятор не поворачивается автоматически (может быть, просто ошибка симулятора) и (это действительно важная часть), изображение не изменяется автоматически, поэтому оно слишком узкий для экрана (там есть большая черная область справа).

  • Вид контроллера 2 выглядит в той же ориентации, что и просмотр контроллера 1 (пейзаж, а не портрет).

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

Итак, как мы должны это делать сейчас? Это связано с коллекциями признаков? С предпочтительным размером контента? С настройкой ориентации строки состояния вручную?

4b9b3361

Ответ 1

Ответ на часть 1 (запуск в ландшафт) неизменен от iOS 7: все зависит от порядка возможных ориентаций в файле Info.plist. Итак, скажем, что View Controller 1 говорит следующее:

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

Затем мы будем последовательно внедряться в ландшафт, если ориентация ландшафта ориентирована на ориентированные на Info.plist ориентации интерфейса:

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

Одним из примечательных изменений в iOS 8 является то, что по умолчанию строка состояния скрыта, когда мы находимся в ландшафте. Но вы можете предотвратить это, при желании, с соответствующим переопределением:

-(BOOL)prefersStatusBarHidden {
    return NO;
}

Это не отвечает на вторую часть моего вопроса, а именно, как заставить вращение, когда представлен контроллер представления. Как я объяснил в этом ответе, я считаю, что это станет невозможным в iOS 8. Ожидается, что ваш контроллер просмотра и ваши взгляды будут "адаптироваться" - и так вы.

РЕДАКТИРОВАТЬ: Похоже, что в семени 4 возможность принудительного вращения приложения на представлении/увольнении диспетчера представлений возвращается!

Ответ 2

Проблема может возникнуть в вашем файле *.plist

Проверьте, что вы хотите, чтобы указать ориентацию по умолчанию/первый запуск для экрана как

Поддерживаемые ориентации интерфейса:

item 0 Пейзаж (кнопка правой кнопки)

позиция 1 Портрет (нижняя кнопка дома)

Эта "ошибка", которую я преследовал за несколько дней до того, как я, наконец, проверил работу UIInterface в глобальном поиске в Xcode и заметил, что у меня были ориентировки, которые моя игра не поддерживает (вся игра на 100% с правой стороны)

Я избавился от Landscape Left, который стал причиной запуска GameCenter в альбомный альбом Left Left, если я физически удерживал устройство в альбомной ориентации слева.

Проблема решена.