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

时间:2017-02-05 21:14:35

标签: ios uinavigationcontroller uiviewanimation uiviewanimationtransition

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

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

有没有人碰到这个?我和其他所有人做错了吗?或者这是使用UINavigationControllers定制过渡动画的无意结果吗?

我已经在设备和模拟器上测试了相同的结果。

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

1 个答案:

答案 0 :(得分:0)

我没有真正的答案,因为这似乎是一个真正的Apple Bug。从这个forum已经提交了一个雷达,并且显示了解决问题的黑客攻击。这是我做的:

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

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

第二,我在受影响的viewControllers的rotateTopView方法中添加了对我的新viewWillAppear方法的调用:

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

希望Apple很快就能解决定制动画问题后的轮换问题,但考虑到原始雷达是在2015年提交的,我并没有屏住呼吸。

相关问题