我有一个在iOS 6中开发的应用程序。但是现在在iOS 7甚至我的应用程序为iOS 6编译,但在iOS 7设备上运行顶部导航栏(iOS 7中的新巨人)我的内容是隐藏的。顶部导航栏覆盖它。如果我用CGRect手动向下移动它在iOS 7中看起来不错,但是现在iOS 6看起来很糟糕(在它上面的空间很大)。
应用程序是使用自动布局关闭构建的,因为自动布局是很难正确设置的方法。
我的问题是,是否有一种简单的方法可以仅针对iOS 7移动内容?我真的不想重新开启自动布局,花一个月时间尝试将所有UI元素重新安装到位。该应用程序相当复杂,有30多个屏幕,屏幕上有很多动画视图。
答案 0 :(得分:29)
我认为即使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;
答案 1 :(得分:10)
您也可以尝试设置navigationBar.translucent = NO
,如this answer中所述。
答案 2 :(得分: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上的结果:
左侧的屏幕截图隐藏了导航栏,而右侧的图像显示了导航栏 - 表格内容正确隐藏在导航栏下方。
希望这有帮助!
答案 3 :(得分:0)
穿戴 self.edgesForExtendedLayout = UIRectEdgeNone;
在ViewDidLoad方法中