在 UINavigationController 中支持纵向和横向视图的最佳实践
Posted
技术标签:
【中文标题】在 UINavigationController 中支持纵向和横向视图的最佳实践【英文标题】:Best practice to support portrait and landscape views in a UINavigationController 【发布时间】:2011-06-02 15:51:01 【问题描述】:我从高处和低处搜索,但我不确定我得出的结果是处理这个问题的最佳方法(尽管它似乎是唯一的方法)。
根据Want to use muliple nibs for different iphone interface orientations我实现了相关方法,似乎一切正常。不幸的是,我必须处理 UINavigationController,并且每个页面都必须支持纵向和横向模式,并在两种模式下重现相同的功能。这意味着如果用户在某个时候决定从纵向切换到横向,整个应用程序应该允许他以他选择的模式来回浏览页面。
显然缺少的一点是如何处理这个问题。在我看来,我有许多带有附加 showChild 方法的按钮来执行导航。一切都在纵向模式下运行良好(据我所知,这是默认模式)。方法如下:
- (IBAction)showChild:(UITapGestureRecognizer *)sender
UIView *view = [sender view];
PortraitViewController *nextPortraitViewcontroller = [[PortraitViewController alloc] initWithNibName:@"Portrait" bundle:nil];
[self.navigationController pushViewController:nextPortraitViewcontroller animated:YES];
但是当涉及到横向模式时,我得到的结果好坏参半。 LandscapeViewController 类中的 showChild: 方法完全相同,它从 PortraitViewController 开始构建一个视图并将其推送到导航控制器。一切似乎都很顺利,但是当我向后导航时,我看到了以前的 PortraitViewController,而不是风景,而且它的子视图都散布在各处,而不是我放置它们的地方。
现在的问题是:由于 Apple 似乎并不真正关心文档和最佳实践(afaik 整个机制远非理想,我可以说这是来自人机交互设计和编程的背景) 什么是正确的--Apple 这样做的方式是什么?
【问题讨论】:
我想你想在 viewWillAppear: 中测试以前可见的视图控制器,它仍然是它上次出现时的方向 遗憾的是,当 ViewControllers 在 UINavigationController 中被推送和弹出时,这些方法不会被调用。我可以将自定义 RootViewController 设为 UINavigationControllerDelegate 并使用相关方法,但我不知道如何。 好的,我通过使用自定义 RootViewController 并将其设置为导航控制器的委托解决了问题。不幸的是,它并没有像我希望的那样工作,但我明天会检查它。我还必须检查设备,因为现在我正在使用模拟器,这对方向非常糟糕。 【参考方案1】:我设置了一个示例项目来演示我是如何“解决”我的问题的。这可能不是唯一的方法,也不是最好的方法,但由于文档或缺乏文档,这是我想出的最好的方法。
https://github.com/Morpheu5/Rotation
【讨论】:
以上是关于在 UINavigationController 中支持纵向和横向视图的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?
从嵌入在 UINavigationController 中的一个视图控制器到另一个 UINavigationController
(Swift) 在嵌套在 Main UINavigationController 中的 UINavigationController 和 UITabController 之间切换
关闭 UINavigationController 并呈现另一个 UINavigationController
带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller