Портрет по умолчанию, Как некоторые специальные экраны могут автоматически поворачиваться или заставлять некоторые экраны в альбомной ориентации? - PullRequest
0 голосов
/ 08 ноября 2018

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

in AppDelegate.swift :

class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?

// portrait by default
var interfaceOrientations:UIInterfaceOrientationMask = .portrait {
    didSet{
        // force to portrait
        if interfaceOrientations == .portrait {
            UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue,
                                      forKey: "orientation")
        }
            // force to landscape
        else if !interfaceOrientations.contains(.portrait){
            UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight.rawValue,
                                      forKey: "orientation")
        }
    }
}

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return interfaceOrientations
}

только на портрете vc:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    appDelegate.interfaceOrientations = .portrait
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    appDelegate.interfaceOrientations = .portrait
}

в vc с автоповоротом:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    appDelegate.interfaceOrientations = .allButUpsideDown
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    appDelegate.interfaceOrientations = .portrait
}

только в ландшафте vc:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    appDelegate.interfaceOrientations = [.landscapeLeft, .landscapeRight]
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    appDelegate.interfaceOrientations = .portrait
}

но в ней все еще есть ошибки ... Помогите мне

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы можете настроить свой Контроллер книжного обзора и Контроллер альбомного обзора. LandscapeViewController, как это:

`` `

 override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight.rawValue, forKey: "orientation")
 }

 override var shouldAutorotate: Bool {
    return true
 }

 override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .landscapeRight
 }

 override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return .landscapeRight
 }

`` `

Некоторые моменты, на которые следует обратить внимание: UIViewController не может решить вращаться автоматически, вы можете использовать UINavigationController, чтобы получить значение свойства вращения:

override var shouldAutorotate: Bool {
    return (self.topViewController?.shouldAutorotate)!
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return (self.topViewController?.supportedInterfaceOrientations)!
}

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return (self.topViewController?.preferredInterfaceOrientationForPresentation)!
}
0 голосов
/ 08 ноября 2018

Вы должны форсировать вращение:

UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")

Вы также должны включить автоповорот

override var shouldAutorotate: Bool{
    return true
}

И, конечно же, в настройках вашего проекта вы должны включить как портретный, так и ландшафтный режимы.

...