2

如何在 iOS 6 和 iOS 7 中通过故事板使用 UIContainerView 支持导航栏?

我正在将 iOS 6 应用程序更新到 iOS 7,但希望继续支持 iOS 6。我有一个嵌入在 UINavigationController 中的主顶层视图。导航控制器中的视图中有一个容器视图。我正在使用故事板来布置视图。

在 iOS 7 上,导航控制器使用整个屏幕,我将其设置为将容器视图内容放在导航栏下方。在 iOS 6 中,视图的内容不在导航栏下方,因此导航栏下方有一个空白。

通常我会在 iOS6 上重置有问题的视图的来源(在 ViewDidLoad 或类似的地方),然后继续我的方式。但是,由于我的内容位于 UIContainerView 中,因此加载后我似乎无法更改框架。(我在prepareForSegue中试过这个:加载UIContainerView时。我愿意做错了吗?呵呵)

我发现的最接近的是在 iOS 7 下使用以下代码使导航栏不透明并使其下方的内容远离,然后将整个空间用于我的 UIContainerView。

  // tell the view to not extend below this nav bar
  if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

此解决方案有效,但具有将状态栏显示为黑色的副作用(因为它在状态栏下方或多或少是“空白”)。或者,如果我将容器视图的顶部边缘放在状态栏下方,在 iOS 6 上,我在导航栏下方有一个很大的间隙。

我可以取消使用导航控制器,但在这种情况下似乎有点笨拙,我想将其用作最后的手段。

4

2 回答 2

2

我已经找到了解决方案。

您需要在 iOS 7 中设置 barTintColor,它似乎也为主状态栏着色,以及将导航栏设置为不透明,如下所示:

mainController.navigationBar.barTintColor = [SRPRTabletHelpers customUserColor];
mainController.navigationBar.translucent = NO;

不透明是关键,同时设置颜色不仅设置常规导航栏,还设置状态栏下方的颜色。

我还需要将 containerView 顶部边缘更改为包含在导航控制器中的视图的完整高度,因为它不是透明的,并且它在 iOS6 和 iOS 7 上的工作方式相同。

于 2013-10-02T21:54:59.713 回答
0

虽然您提到已经解决了这个问题,但您的方法似乎需要大量手动代码和if检查。iOS 7 UI 转换指南,在 Supporting iOS 6 一章中提到了另一种方法:首先像你所做的那样为 iOS7 设计你的界面,让你的视图延伸到导航栏下方。

然后,在界面构建器中打开 UI 元素的大小检查器并修改 iOS 6/7 增量。当故事板不在 iOS 7 上运行时,将应用这些值。例如,在您的情况下,您可以选择所有视觉元素,然后将 Y 增量设置为 -44,这是标准导航高度。这将使 UI在 iOS6 上上升,补偿视图不在导航栏下方的事实。

于 2014-02-03T22:14:14.003 回答