从纵向视图控制器呈现的景观视图控制器偶尔会出现在具有横向边界的纵向方向上

时间:2017-06-13 09:55:04

标签: ios swift uiviewcontroller uinavigationcontroller landscape

我有一个简单的应用,其中肖像UINavigationController呈现景观UINavigationController。通常它工作正常。有时,横向视图控制器以纵向显示,但具有横向边界。

以下是它的工作方式:为了限制导航控制器的方向,我有一个派生自OrientableNavigationController的类UINavigationController并公开特定于旋转的属性:

class OrientableNavigationController: UINavigationController {
  private var _supportedInterfaceOrientations: UIInterfaceOrientationMask = .all
  private var _shouldAutorotate: Bool = false
  private var _preferredInterfaceOrientationForPresentation: UIInterfaceOrientation = .portrait

  override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    get { return _supportedInterfaceOrientations }
    set { _supportedInterfaceOrientations = newValue }
  }

  override var shouldAutorotate: Bool {
    get { return _shouldAutorotate }
    set { _shouldAutorotate = newValue }
  }

  override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    get { return _preferredInterfaceOrientationForPresentation }
    set { _preferredInterfaceOrientationForPresentation = newValue }
  }
}

我在AppDelegate中初始化其中一个,给它一个视图控制器并将其设置为窗口的rootViewController

private var portraitNavigationController = OrientableNavigationController()

func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  portraitNavigationController.supportedInterfaceOrientations = .portrait
  portraitNavigationController.shouldAutorotate = true
  portraitNavigationController.preferredInterfaceOrientationForPresentation = .portrait

  let portraitViewController = PortraitViewController()
  portraitViewController.delegate = self

  portraitNavigationController.pushViewController(portraitViewController, animated: false)

  window = UIWindow(frame: UIScreen.main.bounds)

  window!.rootViewController = portraitNavigationController

  window!.makeKeyAndVisible()

  return true
}

看起来像这样:

现在的景观视图控制器'按钮连接起来执行此操作:

func portraitViewControllerButtonWasTouched(_ viewController: PortraitViewController) {
    let landscapeNavigationController = OrientableNavigationController()
    landscapeNavigationController.supportedInterfaceOrientations = .landscape
    landscapeNavigationController.shouldAutorotate = true
    landscapeNavigationController.preferredInterfaceOrientationForPresentation = .landscapeLeft
    landscapeNavigationController.isNavigationBarHidden = true

    let landscapeViewController = LandscapeViewController()

    landscapeNavigationController.pushViewController(landscapeViewController, animated: false)

    portraitNavigationController.present(landscapeNavigationController, animated: true)
  }

大部分时间,这都很好。横向视图控制器的显示方式如下:

有时候,会发生这种情况:

这在模拟器和设备中都会发生。有什么想法吗?

0 个答案:

没有答案