Как "заставить" представление отображаться в портретной ориентации, когда оно загружается / отображается вместе с устройством в альбомной ориентации?
Я поддерживаю все ориентации и авторотацию в своем приложении для iOS, но я бы хотел, чтобы определенные контроллеры представления не отображали свои виды в альбомной ориентации. Я реализую shouldAutorotate
Метод в таком виде контроллеров:
- (BOOL)shouldAutorotate
{
return NO;
}
и это, безусловно, предотвращает поворот вида на ландшафт при загрузке или появлении в портретной ориентации. Но когда контроллер представления загружен или кажется, что это устройство уже в альбомной ориентации, представление отображается в альбомной ориентации.
Как я могу загрузить / заставить вид отображаться в портретной ориентации с самого начала, независимо от ориентации устройства?
Спасибо
2 ответа
Вы можете использовать метод supportedInterfaceOrientations()
чтобы указать ориентацию, доступную для определенного контроллера представления.
Но когда вы встраиваете свои контроллеры представления в стек навигации, системные вызовы shouldAutorotate
а также supportedInterfaceOrientations
на вашем контроллере навигации, и значение, возвращаемое из ваших контроллеров представления, игнорируется.
Я использую подкласс UINavigationController
чтобы получить поддерживаемые ориентации от контроллера вида сверху. Вы также можете создать такой класс для UITabBarViewController
class SingleOrientationNavigationController: UINavigationController {
//MARK : Orientation
override func shouldAutorotate() -> Bool {
if let topVC = topViewController {
return topVC.shouldAutorotate()
}
return false
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if let topVC = topViewController {
return topVC.supportedInterfaceOrientations()
}
return UIInterfaceOrientationMask.Portrait
}
// MARK : Status bar
override func preferredStatusBarStyle() -> UIStatusBarStyle {
if let topVC = topViewController {
return topVC.preferredStatusBarStyle()
}
return .Default
}
}
Будьте осторожны, у вас могут возникнуть некоторые проблемы, если контроллеры push-представления получили меньшую опцию вращения, чем предыдущая.
Давайте рассмотрим два контроллера представления:
A : only portrait
B : all orientation
Если толчок выполняется от A до B, то все будет в порядке, B может вращаться по своему усмотрению, и даже если B находится в горизонтальной ориентации, когда он появится, вы вернетесь к A в портретной ориентации.
Но если толчок выполняется от B к A, когда B находится в альбомной ориентации, то A также будет отображаться в альбомной ориентации! Одним из обходных путей является использование модальных контроллеров представления вместо нажатия на него в этом особом случае.
Это можно сделать, добавив Initial interface orientation = Portrait (bottom home button)
в .plist
вашего приложения.