ios7適配一些問題
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中有明顯的默認邊框