Swift 4 вращает только один экран UITabBarController - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть класс UITabBarController и я хочу, чтобы вращался только один из ViewController, все остальные ViewController всегда должны отображаться в портретном режиме.

При переключении из RotateViewController в другой ViewController в альбомной ориентации экран остается в горизонтальной ориентации независимо от поворота.Похоже, правильное вращение не «переоценено» при переключении экранов.

class TabBarController: UITabBarController {

override var shouldAutorotate: Bool {
    if self.selectedViewController is RotateViewController {
        return true
    }
    return false
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    if self.selectedViewController is RotateViewController {
        return [.portrait, .landscapeRight, .landscapeLeft]
    }
    return .portrait
}

Принудительное вращение не работает.Это отобразит все отдельные элементы в альбомной ориентации, а затем повернет весь экран.

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

1 Ответ

0 голосов
/ 19 сентября 2018

В AppDelegate

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if let rootViewController = self.topViewControllerWithRootViewController(rootViewController: window?.rootViewController) {
        if (rootViewController.responds(to: Selector(("canRotate")))) {
            return .allButUpsideDown;
        }
    }

    return .portrait;
}

private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
    if (rootViewController == nil) { return nil }
    if (rootViewController.isKind(of: UITabBarController.self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
    } else if (rootViewController.isKind(of: UINavigationController.self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
    } else if (rootViewController.presentedViewController != nil) {
        return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
    }
    return rootViewController
}

В вашем ViewController add

override func viewDidLoad {
    super.viewDidLoad()

    self.canRotate()
}

@objc func canRotate() -> Void {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...