iOS7 edgesForExtendedLayout
在iOS 7中,苹果引入了一个新的属性,叫做[UIViewController setEdgesForExtendedLayout:]
,它的默认值为UIRectEdgeAll
。当你的容器是navigation controller时,默认的布局将从navigation bar的顶部开始。这就是为什么所有的UI元素都往上漂移了44pt。
修复这个问题的快速方法就是在方法- (void)viewDidLoad
中添加如下一行代码:
self.edgesForExtendedLayout = UIRectEdgeNone
这样问题就修复了。
1,首先
1
2
3
4
5
6
7
8
9
|
//定义宏,判断ios7
#define IOS7 [[[UIDevice currentDevice]systemVersion] floatValue] >= 7.0
//添加代码
if
(IOS7)
{
self
.edgesForExtendedLayout = UIRectEdgeNone;
//视图控制器,四条边不指定
self
.extendedLayoutIncludesOpaqueBars =
NO
;
//不透明的操作栏<br> self.modalPresentationCapturesStatusBarAppearance = NO;
}
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if
(IOS7)
{
self
.edgesForExtendedLayout = UIRectEdgeNone;
self
.extendedLayoutIncludesOpaqueBars =
NO
;
self
.modalPresentationCapturesStatusBarAppearance =
NO
;
// self.automaticallyAdjustsScrollViewInsets = NO;
// self.navigationController.navigationBar.translucent = NO;
// self.tabBarController.tabBar.translucent = NO;
}
#endif
|
self.automaticallyAdjustsScrollViewInsets = NO;
看 这个UIViewController的这个属性你就明白了,此属性默认为YES,这样UIViewController下如果只有一个 UIScollView或者其子类,那么会自动留出空白,让scollview滚动经过各种bar下面时能隐约看到内容。但是每个 UIViewController只能有唯一一个UIScollView或者其子类,如果超过一个,需要将此属性设置为NO,自己去控制留白以及坐标问 题。
http://blog.csdn.net/mac_cm/article/details/9234451,这个里面有一些属性介绍
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
这个是判断iphone5 or 4
注意,目前我做的适配
如果之前使用了nib文件,同时ui不是自己手写代码add上去的,这里需要在代码里控制每一个ui了(如果你也中枪,那就跟我一样慢慢改吧,以后写代码尽可能手动)
如果是代码里画的ui,那么问题不大,做出响应调整即可。
当然如果你不需要兼容ios5.0,这样可以完全使用autolayout,这样可以使你的工作量降至最低,如果有不同方法欢迎大家来讨论