UINavigationController 自定义过渡,防止堆栈中不可见的视图控制器旋转
UINavigationController custom transition, prevents non-visible view controllers in stack from rotating
我已经按照各种教程下载了多个版本的自定义 UINavigationController 自定义过渡动画示例:
- https://www.appcoda.com/custom-view-controller-transitions-tutorial/ - https://github.com/appcoda/CustomViewTransitionDemo
- https://github.com/robertmryan/Interactive-Custom-Transitions-in-Swift
我写的和下载的都是同样的问题。呈现新的视图控制器后,如果我旋转设备然后导航回来,堆栈中先前视图控制器的 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 年提交的,我不会屏住呼吸。
我已经按照各种教程下载了多个版本的自定义 UINavigationController 自定义过渡动画示例:
- https://www.appcoda.com/custom-view-controller-transitions-tutorial/ - https://github.com/appcoda/CustomViewTransitionDemo
- https://github.com/robertmryan/Interactive-Custom-Transitions-in-Swift
我写的和下载的都是同样的问题。呈现新的视图控制器后,如果我旋转设备然后导航回来,堆栈中先前视图控制器的 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 年提交的,我不会屏住呼吸。