我最近下载了Xcode 5 DP,在iOS 7上测试我的应用。我注意到并确认的第一件事是,视图的边界并不总是根据状态栏和导航栏调整大小。
在viewDidLayoutSubviews中,我打印了视图的边界:
{{0, 0}, {320, 568}}
这导致我的内容出现在导航栏和状态栏的下方。
我知道我可以通过获取主屏幕的高度,减去状态栏的高度和导航栏的高度来解释高度,但这似乎是不必要的额外工作。
我该如何解决这个问题?
更新:
我已经找到了解决这个问题的方法。将导航栏的半透明属性设置为NO:
self.navigationController.navigationBar.translucent = NO;
这将修复视图被框在导航栏和状态栏下面的问题。
然而,我还没有找到一个修复的情况下,当你想导航栏是半透明的。例如,在全屏查看一张照片时,我希望导航栏是半透明的,视图被框在它下面。这是可行的,但是当我切换显示/隐藏导航栏时,我经历了更奇怪的结果。第一个子视图(一个UIScrollView)每次都会改变它的边界y原点。
我有一个场景,我使用苹果编写的BannerViewController来显示我的广告和嵌入在BannerViewController中的ScrollViewController。
为了防止导航栏隐藏我的内容,我必须做两个更改。
1)修改BannerViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
}
2)修改我的scrollviewcontroller
- (void)viewDidLoad
{
[super viewDidLoad];
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeBottom;
}
}
现在广告正确地显示在视图的底部,而不是被导航栏覆盖,顶部的内容也没有被切断。
我想扩展Stunner的答案,并添加一个if语句来检查它是否是iOS-7,因为当我在iOS 6上测试它时,我的应用程序会崩溃。
增加的内容是:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
我建议把这个方法添加到你的myviewcontroller中。m文件:
- (void) viewDidLayoutSubviews {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
viewBounds.origin.y = topBarOffset * -1;
self.view.bounds = viewBounds;
}
}