18

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

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

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

4

4 回答 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; 
于 2013-09-29T21:34:18.203 回答
10

您也可以尝试设置navigationBar.translucent = NO,如本答案中所述。

于 2013-09-29T19:29:01.470 回答
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 上的结果:

导航栏被隐藏。 显示导航栏。

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

希望这可以帮助!

于 2013-12-24T18:31:18.100 回答
1

把 self.edgesForExtendedLayout = UIRectEdgeNone;

在您的 ViewDidLoad 方法中

于 2016-04-12T18:40:59.967 回答