一 没有导航栏的viewController适配方法
在iOS7中view默认是全屏模式,状态栏的高度也加在了view的高度上,例如iOS7之前iphone5中self.view.frame.size.height = 548,在iOS7中就是568了,在iOS7中navigationbar是半透明的,statusbar则是全透明的,这样一来,原来的程序用xcode5+iOS7sdk上编译后运行就会出现问题了。如下,在视图上加一个view,和状态栏重叠
了
改正方法:
(1)修改本视图的bounds
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{
self.view.bounds = CGRectMake(0, -20, 320, self.view.bounds.size.height);
}
这种方法需要更改每一个viewController,较为麻烦
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{
//设置状态栏的样式
[application setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.clipsToBounds = YES;
self.window.frame = CGRectMake(0, 20, 320, self.window.frame.size.height - 20);
}
运行,会看到状态栏消失了,
解决方法:在info.plist文件中添加View controller-based status bar appearance项,设置为NO。状态栏就会出现了,如下:
(二)有导航栏的viewController适配方法
现在将根视图改为UINavigationController,不设置任何属性,运行结果:
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
edgesForExtendedLayout是一个类型为UIExtendedEdge的属性,指定边缘要延伸的方向。 因为iOS7鼓励全屏布局,它的默认值很自然地是UIRectEdgeAll,四周边缘均延伸,就是说,如果即使视图中上有navigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域。将其设置为UIRectEdgeNone,就不会延伸到这些区域了,
其他的一些属性:
(1) self.automaticallyAdjustsScrollViewInsets = YES;在iOS7中如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scroll占据整个视图,又不会让导航栏遮盖.
(2)self.extendedLayoutIncludesOpaqueBars = YES;这个属性指定了当Bar使用了不透明图片时,视图是否延伸至Bar所在区域,默认值时NO。