1. 如何判断版本
如果你已经开发过ios旧版本的app,现在想适配在ios7上,那如何判断现在的版本类型是一个很有用的办法:
[[[UIDevice currentDevice] systemVersion] floatValue] < 7.0 //如果当前ios版本小于7
通过该判断你可以写出针对于ios7的分支代码出来,对于一些细节的问题非常有用。
2. 布局问题
在ios7适配中,布局问题是一个很头痛也很重要的问题,因为在ios7中viewController使用了全屏布局的方式,也就是说导航栏和状态栏都是不占实际空间的,状态栏默认是全透明的,导航栏默认是毛玻璃的透明效果。
如果在ios7中加入一个view,我们可以看到以下代码的效果:
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,100)];
[label setText:@”大家好”];
[label setTextColor:[UIColor blueColor]];
[label setBackgroundColor:[UIColor blueColor]];
[self.view addSubview:label];
方案一:
self.navigationController.navigationBar.translucent = NO;
这句话的意思就是让导航栏不透明且占空间位置,所以我们的坐标就会从导航栏下面开始算起。
方案二:
self.edgesForExtendedLayout = UIRectEdgeNone;
edgesForExtendedLayout是ios7的新属性,所以在ios7以下设备会出现奔溃现象,解决办法就是先判断在使用,可以通过判断系统版本,也可以通过判断方法是否可使用
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
edgesForExtendedLayout默认的值是UIRectEdgeAll就是全部布局的意思,改成UIRectEdgeNone就会和ios7一起的系统版本一样的效果
方案三:
为ios7单独定制位置,通过判断系统版本,个性为ios7定制位置。
const BOOL is_ios7 = [[[UIDevice currentDevice] systemVersion] floatValue] < 7.0;
int y= is_ios7 ? 64 : 0;
3. UITableView样式
在ios开发中UITableView是最常用的控件,ios7对于UITableView的改动也是非常大的。
1).布局上
上面说的ios7的初始化位置都是从屏幕开始的,但是如果你使用UITableView全屏显示会发现他的位置是正确的,而且导航栏的毛玻璃效果闪闪发亮。那是因为在ios7的controller中增加了automaticallyAdjustsScrollViewInsets 属性,默认值为YES。他的作用就是如果视图中有唯一的ScrollView存在,那么它会自动改变ScrollView中contentView的位置,让其不会让导航栏挡住,也能让ContentView移上去的时候在导航栏后面显示。
当然,然后视图里的ScrollView不满足系统的要求,我们就需要自己控制contentView的位置了:
UIEdgeInsets contentInset = self.tableView.contentInset;
contentInset.top = 64;
[self.tableView setContentInset:contentInset];
这样也就是达到了automaticallyAdjustsScrollViewInsets属性的效果
2).样式上
ios7上的tableView样式有很大的改动,尤其是grouped样式下。
我们可以看到ios7中cell的分割线是默认不会画满的,空出的位置大小是会根据cell.imageView的大小决定了。如果你他能跟ios6一样的效果,值需要将cell的separatorInset属性的left值改成0即可。
4. statusBar修改样式
大家可能发现了在ios7中statusBar的颜色明明可以有下面几种选择的但是缺没有效果。
UIStatusBarStyleDefault 默认色,随背景颜色深浅改变,优先黑色
UIStatusBarStyleLightContent 随背景颜色深浅改变,优先白色
UIStatusBarStyleBlackTranslucent 黑色透明
解决方法:
第一步:在Plist里面添加 UIViewControllerBasedStatusBarAppearance 设置为:NO
第二步:在入口类中写:[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
5. 其他问题
UILable背景问题
在ios7中UILable的背景默认是clearColor,而ios6中默认是白色
UIButton样式问题
在ios7中UIButton默认是没有背景框的,在ios6中有明显的默认边框
更多ios7配置位置请下载《iOS 7 UI Transition Guide》