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,状态栏和导航栏:像 Reeder 一样使用侧面板隐藏或滑动
无法在 iPhone/iPod touch 的 Safari iOS 7 中隐藏导航栏