Как "заставить" представление отображаться в портретной ориентации, когда оно загружается / отображается вместе с устройством в альбомной ориентации?

Я поддерживаю все ориентации и авторотацию в своем приложении для 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 вашего приложения.

Плист изображение

Другие вопросы по тегам