iOS 7 导航栏隐藏内容

Posted

技术标签:

【中文标题】iOS 7 导航栏隐藏内容【英文标题】:iOS 7 Navigation Bar Hiding Content 【发布时间】:2013-09-29 18:29:01 【问题描述】:

我有一个在 ios 6 中开发的应用程序。但现在在 iOS 7 中,甚至我的应用程序为 iOS 6 编译,但在 iOS 7 设备上运行顶部导航栏(iOS 7 中的新巨人)我的内容是隐藏的。顶部导航栏覆盖它。如果我使用 CGRect 手动将其向下移动,它在 iOS 7 中看起来不错,但现在 iOS 6 看起来很糟糕(上面有很多空间)。

该应用是在关闭自动布局的情况下构建的,因为自动布局很难正确设置。

我的问题是,有没有一种简单的方法可以只为 iOS 7 下移内容?我真的不想重新打开自动布局并花费一个月的时间来尝试让所有 UI 元素恢复原状。该应用程序非常复杂,有 30 多个屏幕和许多屏幕上的动画视图。

【问题讨论】:

你不需要自动布局来修复它,请阅读iOS 7 UI Transition Guide 【参考方案1】:

我认为,即使 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注意:这与内容无关,因为半透明而与内容有关,但这是一个完全不同的故事!

因为extendedLayoutIncludesOpaqueBars默认是NO,所以self.navigationController.navigationBar.translucent = NO的意思是基本有

self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight| UIRectEdgeBottom; 

或者,更一般地说,类似的东西(就像伪代码给出一个想法......)

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

【讨论】:

当我在最新版本的 xcode 中使用它时,为什么会出现“使用未声明的标识符 'UIRectEdgeNone'”?当我看到这个答案时,似乎没有其他人提到这个问题。 @James 因为您没有 iOS 7 SDK。你需要升级你的 XCode 才能为 iOS 7 开发。 @Pwner 我已经升级了它。这就是为什么我很困惑。我那天早些时候下载并安装了它。它被设置为使用 IOS7 作为我的基础 SDK。 当我这样做时,我得到一个奇怪的效果,状态和导航栏的背景从白色变成深灰色再到浅灰色。这是个常见的问题吗?有谁知道如何阻止它发生? @ThomasW 你需要将状态栏半透明设置为NO【参考方案2】:

您也可以尝试设置navigationBar.translucent = NO,如this answer 中所述。

【讨论】:

@HepaKKes 我不明白反对意见。如果您将半透明设置为否,并且在情节提要的导航控制器中未选中“在不透明条下延伸边缘”,则这是一个有效的答案。见:***.com/a/18775241/953105 我还在为SDK 6.1编译,设置edgeForExtendedLayout对我没有影响,但是设置导航栏半透明解决了问题。【参考方案3】:

隐藏导航栏,请将以下内容添加到您的 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 上的结果:

左边的截图是隐藏了导航栏,而右边的图片是显示了导航栏——表格的内容正确地隐藏在导航栏下。

希望这会有所帮助!

【讨论】:

感谢您的代码,我注意到的一件事是您无法单击任何内容,因为导航栏在技术上是不可见的(但未删除)【参考方案4】:

放 self.edgesForExtendedLayout = UIRectEdgeNone;

在您的 ViewDidLoad 方法中

【讨论】:

以上是关于iOS 7 导航栏隐藏内容的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7隐藏导航栏时如何更改状态栏的颜色?

iOS 7,状态栏和导航栏:像 Reeder 一样使用侧面板隐藏或滑动

导航栏隐藏标题和后退按钮 iOS 7

无法在 iPhone/iPod touch 的 Safari iOS 7 中隐藏导航栏

无法在 iPhone/iPod touch 的 Safari iOS 7 中隐藏导航栏

Monotouch Dialog 部分隐藏在 IOS 7 顶部导航栏和时钟后面