横向模式下的导航控制器堆栈,但总是以纵向帧大小模态呈现视图控制器视图
Posted
技术标签:
【中文标题】横向模式下的导航控制器堆栈,但总是以纵向帧大小模态呈现视图控制器视图【英文标题】:Navigation controller stack in landscape mode, but modally presented view controller view always in portrait frame size 【发布时间】:2012-10-28 10:52:57 【问题描述】:我的应用主要使用导航控制器堆栈,有时会模态显示一些控制器。在横向模式下,导航控制器堆栈中的控制器工作正常,但 presentViewController 或以前的 presentModalViewController 显示的其他视图控制器始终提供纵向尺寸的视图框架(在 iPad ios 6.0 上始终为 768x1024) - 即使在纵向和横向之间来回旋转也是如此。
有点与A view controller is in landscape mode, but I'm getting the frame from portrait mode? 相关,但检查的答案没有帮助。如果我将稍后的视图控制器添加为导航堆栈的一部分,则在第一次加载和后续旋转时会发生调整大小。如上所述,只有在通过 presentViewController 添加控制器时才会出现问题。
【问题讨论】:
【参考方案1】:将模态分支包装到另一个导航控制器并在那里定义旋转掩码。
在 iOS6 中,- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)
仅适用于导航堆栈分支,整个分支应该以相同的方式工作。
所以,子类化导航:
@interface CLNotRotatingNavController : UINavigationController
并在其 .m 中添加此
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return NO;
- (NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskLandscape;
- (BOOL) automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
return YES;
并将所有模态分支包装到此导航。这将在必要时将所有内容锁定到 lanscape。
【讨论】:
太棒了。有用。我添加了模态控制器(我只有一个)作为 CLNotRotatingNavController 的根控制器(我实际上允许为 iPad 旋转,但只为 iPhone 旋转,因为我有一个通用应用程序)并使用 presentViewController 显示它。使用dismissViewControllerAnimated 关闭。不错的解决方法。但是让您想知道我们是否从一开始就做错了什么,或者这是否是 iOS 的错误(功能)?我记得两年前提交了一个关于类似错误的错误 - 一年后苹果回应说他们修复了这个错误。 :-P 他们称之为功能,这不是一个错误,因为他们是故意这样做的(甚至记录在案),但我找不到任何理由证明这一举动是合理的。我花了两天时间才弄明白。 :// @whiteagle: 这显示错误请提供一些代码以在 customNavigation 控制器中显示模型视图控制器 我不知道为什么 Apple 决定改变这种行为。我想不出破坏此功能的任何合乎逻辑的原因。以上是关于横向模式下的导航控制器堆栈,但总是以纵向帧大小模态呈现视图控制器视图的主要内容,如果未能解决你的问题,请参考以下文章
UISplitViewController 中的 ActionSheet 在纵向模式与横向模式下的行为不同