popViewController 动画:从横向到纵向
popViewControllerAnimated: From Landscape To Portrait
我无法将 UINavigationController
(子类)从横向视图弹出到纵向视图。
我使用 shouldAutorotate
和 supportedInterfaceOrientations
从 window
的 rootViewController
到我展示的各个视图控制器建立了一个链。
所以,我有一个只支持纵向的视图控制器。下一个推送也支持横屏
当我按下支持横向的然后旋转设备时,一切都在旋转。到目前为止,还不错。
现在,当我回到第一个时,两个视图都在动画之前旋转。因此,第二个 viewController 的横向视图(由于旋转变换,它真的很小)被推到纵向屏幕的右侧。
我希望横向视图向右推(纵向视图控制器的顶部或底部),而纵向视图控制器是在背景中显示。
我怎样才能做到这一点?
我想我可能会尝试使用动画控制器,但是 UINavigationController
的委托方法 navigationController:animationControllerForOperation:
在以不同的方向弹出到视图控制器时不会被调用。
经过几天的试验,我弄清楚了我的问题所在。希望这对以后的人有所帮助。
我试图过度设计链条。
我有一个带有子选项卡栏控制器的自定义容器,其中包含多个导航控制器,其中包含具有不同方向要求的视图控制器。
我的主要失败是假设即使出现模态 window,系统仍会首先询问 window 的根视图控制器。为了解决这种情况,我在容器中添加了一个检查,如下所示:
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
if (self.presentedViewController) { // This check is wrong! Don't do this!
return [self.presentedViewController supportedInterfaceOrientations];
}
// Pass request to child view controller
}
但是,这从根本上从两个方面导致了我的问题。
首先,如果没有这个检查,UIKit 会自动检测模态视图控制器并直接请求它的 supportedInterfaceOrientations
。
其次,UIKit 处理动画的方式涉及呈现几个我们通常不知道的内部视图控制器。通过检查 presentingViewController
中的模态视图控制器,检查捕获了它们并询问它们的 supportedInterfaceOrientations
。 UIKit 不应该以这种方式运行,所以我是干扰其操作的人。
修复是实现 supportedInterfaceOrientations
,这样它只涉及视图控制器的直接后代(即 view
是当前视图控制器视图层次结构中的后代的视图控制器)。直系后代可以进一步向下传递请求。
将模态 windows 视为一个完全独立的链,与演示者无关。
换句话说,信任UIKit
。
我无法将 UINavigationController
(子类)从横向视图弹出到纵向视图。
我使用 shouldAutorotate
和 supportedInterfaceOrientations
从 window
的 rootViewController
到我展示的各个视图控制器建立了一个链。
所以,我有一个只支持纵向的视图控制器。下一个推送也支持横屏
当我按下支持横向的然后旋转设备时,一切都在旋转。到目前为止,还不错。
现在,当我回到第一个时,两个视图都在动画之前旋转。因此,第二个 viewController 的横向视图(由于旋转变换,它真的很小)被推到纵向屏幕的右侧。
我希望横向视图向右推(纵向视图控制器的顶部或底部),而纵向视图控制器是在背景中显示。
我怎样才能做到这一点?
我想我可能会尝试使用动画控制器,但是 UINavigationController
的委托方法 navigationController:animationControllerForOperation:
在以不同的方向弹出到视图控制器时不会被调用。
经过几天的试验,我弄清楚了我的问题所在。希望这对以后的人有所帮助。
我试图过度设计链条。
我有一个带有子选项卡栏控制器的自定义容器,其中包含多个导航控制器,其中包含具有不同方向要求的视图控制器。
我的主要失败是假设即使出现模态 window,系统仍会首先询问 window 的根视图控制器。为了解决这种情况,我在容器中添加了一个检查,如下所示:
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
if (self.presentedViewController) { // This check is wrong! Don't do this!
return [self.presentedViewController supportedInterfaceOrientations];
}
// Pass request to child view controller
}
但是,这从根本上从两个方面导致了我的问题。
首先,如果没有这个检查,UIKit 会自动检测模态视图控制器并直接请求它的 supportedInterfaceOrientations
。
其次,UIKit 处理动画的方式涉及呈现几个我们通常不知道的内部视图控制器。通过检查 presentingViewController
中的模态视图控制器,检查捕获了它们并询问它们的 supportedInterfaceOrientations
。 UIKit 不应该以这种方式运行,所以我是干扰其操作的人。
修复是实现 supportedInterfaceOrientations
,这样它只涉及视图控制器的直接后代(即 view
是当前视图控制器视图层次结构中的后代的视图控制器)。直系后代可以进一步向下传递请求。
将模态 windows 视为一个完全独立的链,与演示者无关。
换句话说,信任UIKit
。