iOS 7导航栏隐藏内容

18

我有一个iOS 6开发的应用程序。但是在iOS 7或者即使我的应用程序编译为iOS 6,但在运行于iOS 7设备上时,顶部导航栏(iOS 7中的新巨型导航栏)会覆盖我的内容,导致我的内容被隐藏。如果我手动使用CGRect将其向下移动,则在iOS 7中看起来很好,但现在在iOS 6中看起来很糟糕(上面有太多空间)。

该应用程序未启用自动布局,因为自动布局过于难以正确设置所有元素。

我的问题是,是否有一种简单的方法仅使iOS 7下的内容向下移动? 我真的不想重新启用自动布局并花费一个月时间尝试将所有UI元素重新排列。 该应用程序非常复杂,拥有30多个屏幕和许多动画视图屏幕。


你不需要使用自动布局来解决它,请阅读iOS 7 UI Transition Guide - HepaKKes
4个回答

30

我认为即使iOS 7已经推出了一年多,这个布局问题仍然存在一点误解。因此,我最终决定进一步阐述我的答案。

事情是这样的。

由于automaticallyAdjustsScrollViewInsets的默认值为YES,一个相当简单的解决方案可以添加以下代码:

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { // if iOS 7
    self.edgesForExtendedLayout = UIRectEdgeNone; //layout adjustements
}

将以下内容加入到 ViewController 的 -viewDidLoad 方法中。

如果您希望解决状态栏的问题(由于导航栏的半透明性质,这并不奇怪),请添加 self.navigationController.navigationBar.translucent = NO。默认值为 YES注意:这与内容无关,但由于半透明性质,与内容相关。

因为默认情况下 extendedLayoutIncludesOpaqueBarsNO,所以 self.navigationController.navigationBar.translucent = NO 基本上意味着拥有

self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight| UIRectEdgeBottom; 

或者更普遍地说,类似于这样(它就像伪代码一样给出一个想法...)

BOOL enableTopEdge =  extendedLayoutIncludesOpaqueBars && !navigationBarIsTranslucent
self.edgesForExtendedLayout = (enableTopEdge & UIRectEdgeTop) | UIRectEdgeLeft | UIRectEdgeRight | UIRectEdgeBottom; 

当我在最新版本的Xcode中使用它时,为什么会出现“使用未声明的标识符'UIRectEdgeNone'”?当我查看答案时,似乎没有其他人提到这个问题。 - James
@James 因为你没有 iOS 7 SDK。你需要升级你的 XCode 才能开发 iOS 7 应用。 - Pwner
@Pwner 我已经升级了它。这就是为什么我感到困惑的原因。那天早些时候我下载并安装了它。而且它被设置为使用IOS7作为我的基本SDK。 - James
当我这样做时,会出现一个奇怪的效果,状态栏和导航栏的背景从白色变成深灰色再到浅灰色。这是一个常见的问题吗?有人知道如何阻止它发生吗? - ThomasW
@ThomasW 你需要将状态栏的半透明设置为“NO”。 - HepaKKes
感谢您的精彩答案!这个问题仍然存在。一个问题 - 您是否有关于该问题的描述链接 - 比如说为什么会发生,这个麻烦的原因是什么 - 预先致谢。 - Karaban

10

您也可以尝试设置 navigationBar.translucent = NO,就像这个回答中提到的一样。


1
@HepaKKes 我不明白为什么会被踩。如果你将透明度设置为否,并且在Storyboard中的导航控制器中未选中“在不透明栏下扩展边缘”,那么这是一个有效的答案。请参见:https://dev59.com/fGMl5IYBdhLWcg3wknsT#18775241 - paulrehkugler
我仍在为SDK 6.1编译代码,设置edgesForExtendedLayout对我没有任何影响,但设置导航栏半透明度解决了问题。 - arlomedia

5
为了隐藏导航栏,您需要在UIViewController中添加以下内容:
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // Hide the top navigation bar.
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.shadowImage = [UIImage new];
    self.navigationController.navigationBar.translucent = YES;
}

要显示导航栏,请使用以下代码:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // Show the top navigation bar.
    self.navigationController.navigationBar.translucent = NO;
}

以下是在iOS7上的结果: Navigation bar is hidden. Navigation bar is shown. 左侧截图是导航栏被隐藏时的样子,右侧图像是导航栏显示时的样子 - 表格内容会正确地隐藏在导航栏下方。
希望这可以帮到您!

谢谢你的代码,我注意到一个问题是由于导航栏在技术上是不可见的(但并未移除),因此无法点击任何内容。 - kevinl

1
在您的ViewDidLoad方法中添加self.edgesForExtendedLayout = UIRectEdgeNone;。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接