iOS - 适用于iPad的viewWillTransition中错误的UIScreen界限

时间:2017-03-14 09:49:57

标签: ios swift ipad uiscreen viewwilltransitiontosize

我必须检查我的设备是否在iOS 8 +中更改了方向。

我的方法是:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let isLand = UIScreen.main.bounds.width > UIScreen.main.bounds.height

    coordinator.animate(alongsideTransition: nil) { _ in
        let isLand2 = UIScreen.main.bounds.width > UIScreen.main.bounds.height


        print("\(isLand) -> \(isLand2)")
    }
}

它在iPhone中运行良好,但在iPad isLand中已经有了新的值,应该在方向完成后,所以:

肖像>景观:true -> true

风景>肖像:false -> false

根据文档,边界应该随着方向而改变,所以它应该有一个前/后边界,不应该吗?

  

UIScreen主要界限:

     

此矩形在当前坐标空间中指定   考虑了对设备有效的任何界面旋转。   因此,此属性的值可能会在设备更改时发生变化   在纵向和横向之间旋转。

如果我使用当前根视图控制器的边界,它可以正常工作iPhone和iPad:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let isLand = UIApplication.shared.keyWindow!.rootViewController!.view.bounds.width > UIApplication.shared.keyWindow!.rootViewController!.view.bounds.height

    coordinator.animate(alongsideTransition: nil) { _ in
        let isLand2 = UIApplication.shared.keyWindow!.rootViewController!.view.bounds.width > UIApplication.shared.keyWindow!.rootViewController!.view.bounds.height


        print("\(isLand) -> \(isLand2)")
    }
}

肖像>景观:false -> true

风景>肖像:true -> false

1 个答案:

答案 0 :(得分:3)

您应该尝试使用协调器上下文的containerView。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let isLand = coordinator.containerView.bounds.width > coordinator.containerView.bounds.height

    coordinator.animate(alongsideTransition: nil) { _ in
        let isLand2 = coordinator.containerView.bounds.width > coordinator.containerView.bounds.height

        print("\(isLand) -> \(isLand2)")
    }

}

如果您想获得有关转换的更多信息,可以使用func view(forKey: UITransitionContextViewKey)func viewController(forKey: UITransitionContextViewControllerKey)使用.from