UINavigationController 自定义过渡,防止堆栈中不可见的视图控制器旋转

UINavigationController custom transition, prevents non-visible view controllers in stack from rotating

我已经按照各种教程下载了多个版本的自定义 UINavigationController 自定义过渡动画示例:

我写的和下载的都是同样的问题。呈现新的视图控制器后,如果我旋转设备然后导航回来,堆栈中先前视图控制器的 none 已旋转。感觉就像是通过使用自定义动画,我从 UINavigationControllers 子控制器中删除了视图控制器,因此它不会发送它在向下接收到的任何旋转消息。

有没有人运行参与其中?我和所有这些其他人做错了什么吗?或者这是使用 UINavigationControllers 的自定义过渡动画的意外结果?

我在设备和模拟器上进行了测试,结果相同。

在上面写了 none 之后,我想到如果我的其中一个过渡不是自定义的会发生什么,所以我测试了它和非自定义动画过渡没有这个问题,从中过渡的视图控制器仍然会适当地获取旋转消息。所以这个问题特别与使用自定义过渡动画有关。

我没有真正的答案,因为这似乎是一个真正的 Apple Bug。从此 forum 提交了雷达,并显示了解决问题的技巧。这是我所做的:

首先,我将此扩展添加到 UIViewController 以设置当前视图层次结构中的顶层视图,使其框架与 UIWindows 框架匹配,从而有效地旋转视图。

extension UIViewController {
    func rotateTopView(view:UIView) {
        if let superview = view.superview {
            rotateTopView(view: superview)
        } else {
            view.frame = UIWindow().frame
        }
    }
}

其次,我在受影响的视图控制器的 viewWillAppear 方法中添加了对新 rotateTopView 方法的调用:

override func viewWillAppear(_ animated: Bool) {        
    // Hack to fix rotation issues
    self.rotateTopView(view: view)
}

希望 Apple 能尽快解决自定义动画后的旋转问题,但考虑到原始雷达是在 2015 年提交的,我不会屏住呼吸。