隨著iOS11和xcode9剛開始正式發(fā)布,小編也迫不及待的更新了xcode9,手機也順利更新到iOS,也終于見到iPhone X 的真面不,看著齊劉海
的樣式,小編心里淡淡的憂傷,怎么適配,如何快速適配到項目中,成了一個蛋疼的問題
文章講解點:
- 1.首先看一下iPhone X的模擬器樣式吧
- 2.iPhone X的設(shè)計圖
- 3.啟動頁的適配
- 4.刷新框架的適配iOS11
- 5.純代碼的寬高比適配
- 6.純代碼適配齊劉海
- 7.純代碼適配iPhone X腳底
- 8.xib和SB適配
- 9,適配iOS 11 列表的冊數(shù)刪除
- 10.tableView的頭部試圖和尾部試圖
- 11.UIBarButtonItem的適配
- 12.無線真機測試
- 13.真機地圖適配
友情鏈接:
- CALyer解讀--總有一個點會讓你想起它
- 2017年iOS面試題總結(jié)
- iOS開發(fā)個人開發(fā)賬號的證書詳細使用及介紹
- 自定義XIB View里面添加其他自定義Xib View
- swift里面的數(shù)組你真的學會了嗎
1.首先看一下iPhone X的模擬器樣式吧
xcode 9 模擬器都帶一個套套,像我這種強迫癥看著淡淡的憂傷,沒辦法直接干掉算了
如果看著大小在電腦上面不合適,就把鼠標放到四個角的時候,可以隨便拖大小的
2.iPhone X的設(shè)計圖
我們可以看出,所有的邊框都是圓角,也是很符合蘋果的設(shè)計規(guī)則,扁平化更凸現(xiàn)出來。有圖我可能可以看出,iPhone X的狀態(tài)欄由原來的
20
變更為現(xiàn)在的44
,來凸現(xiàn)齊劉海
,就是這個狀態(tài)欄的改變變成了多少程序??
噩夢,同樣也是小編,后面小遍會介紹怎么適配
3.啟動頁的適配
iPhone X采用的和iPhone 6p一樣的
@3x
的圖,而不是傳說中的@4x
圖,不然設(shè)計妹妹
真的哭暈在廁所了,適配起來還是比較好弄的,但是iPhone X 的屏幕平尺變?yōu)?code>1125 * 2436,如果你是用的是LaunchImage
來管理啟動頁,那就可以找設(shè)計妹子
給你弄一張圖出來了(晚上一起吃飯不,那就看你本事了)。如果你使用的是LaunchScreen
來適配的啟動頁,聽我一句也去問問設(shè)計妹子吧,畢竟iPhone X的高寬比(iPhone X采用了iPhone 8的寬,卻比iPhone 8p都要高)
發(fā)生了變化,拉伸了設(shè)計妹子
的圖,會給你拼命的,
說的那么多廢話,就一點是重要的iPhone X 的屏幕平尺變?yōu)?code>1125 * 2436
4.刷新框架的適配iOS11
如果你使用了
MJRefresh
等刷新,并且你還隱藏了導航,那么你就會出現(xiàn)一下情況
造成這個原因就是:
iOS 11
上面廢除了automaticallyAdjustsScrollViewInsets
這個屬性的使用,妹妹的搞什么,確實使用了UIScrollView's contentInsetAdjustmentBehavior
來替代,詳細介紹(本篇七秒只做開發(fā)中實際適配,不詳細解答為何這樣適配),如何適配?粘上下面代碼即可
if (@available(iOS 11.0, *)) {
self.home_collectionView.contentInsetAdjustmentBehavior = UIApplicationBackgroundFetchIntervalNever;
} else {
self.automaticallyAdjustsScrollViewInsets = false;
// Fallback on earlier versions
}
但是看到每個地方倒要
if else
,確實不舒服,七秒斗膽寫了一個宏,僅供參考
/// 第一個參數(shù)是當下的控制器適配iOS11 一下的,第二個參數(shù)表示scrollview或子類
#define AdjustsScrollViewInsetNever(controller,view) if(@available(iOS 11.0, *)) {view.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;} else if([controller isKindOfClass:[UIViewController class]]) {controller.automaticallyAdjustsScrollViewInsets = false;}
5.純代碼的寬高比適配
眾所周知
iPhone X
的高寬比和以前的iPhone
機型有所改變,那么我們純代碼適配,都是使用的系數(shù)進行適配,如:CGRectMake(20*kWJWidthCoefficient, 30*kWJHeightCoefficient, 100*kWJWidthCoefficient, 40*kWJHeightCoefficient)
這樣就可以適配使用的機型了,但是偏偏iPhone X
上面寬度沒有變,高度卻增加不少,沒辦法只能在kWJHeightCoefficient
系數(shù)來做文章吧,七秒沒辦法只能在寫個宏了不然,我的一個個的寫啊,累啊
說了那么多廢話,其實就是iPhone X的高寬比和iPhone 8的一樣就OK
,但是iPhone X
確實用的是@3x
的圖
/// 高度系數(shù) 812.0 是iPhoneX的高度尺寸,667.0表示是iPhone 8 的高度,如果你覺的它會變化,那我也很無奈
#define kWJHeightCoefficient (kWJScreenHeight == 812.0 ? 667.0/667.0 : kWJScreenHeight/667.0)
6.純代碼適配齊劉海
眾所周知,
導航的高度為64
,在哪個手機上面都是不變的,iPhone X
沒出來之前是對的,隨便寫64
,iPhone X
出來后,大家都傻眼了,導航欄高度變了有可能為88
,傻眼了吧,如果你純碼寫的都是64
效果如下
這就是自己寫代碼的不規(guī)范造成的,曾經(jīng)有個
程序員
給說過:不要在代碼里面看到重復多次的數(shù)字、字符串等
的使用,如果重復多次就要抽取出來使用常量來表示,如果當時聽他的話,能出現(xiàn)這個效果,嚇的小遍立馬改為(現(xiàn)在已經(jīng)哭暈廁所)
重點 :別直接寫64
了,也別直接寫88
,寫宏吧
重點:別直接寫64
了,也別直接寫88
,寫宏吧
重點:別直接寫64
了,也別直接寫88
,寫宏吧
#define SafeAreaTopHeight (kWJScreenHeight == 812.0 ? 88 : 64)
7.純代碼適配iPhone X
腳底
腳底到底要不要適配,小編也糾結(jié)了一會,默默告訴你,還是問你
產(chǎn)品吧
,誰讓他是老大呢,小編循序的原則就是:列表頁面不去適配,底部有按鈕的界面要適配
,從模擬器自帶的上面也是看到這種效果
其實底部角圓角的距離是
34
,我們可以在任意界面打印安全試圖
就可以找到,在viewSafeAreaInsetsDidChange
方法里面打印NSLog(@"%@",NSStringFromUIEdgeInsets(self.view.safeAreaInsets));
即可知道安全區(qū)域
的邊界
注意:
1.介紹viewSafeAreaInsetsDidChange
方法系統(tǒng)調(diào)用或者你設(shè)置控制器
的additionalSafeAreaInsets安全區(qū)域邊界
2.順序viewSafeAreaInsetsDidChange
調(diào)用順序?qū)嵲?code>viewWillAppear之后,在viewWillLayoutSubvies
之前調(diào)用
重點 :設(shè)置你底部的按鈕按鈕底部距離底部34
即可,但是不要讓上面的試圖的高度蓋住底部按鈕
重點 :設(shè)置你底部的按鈕按鈕底部距離底部34
即可
重點 :設(shè)置你底部的按鈕按鈕底部距離底部34
即可
/// 底部宏,吃一見長一智吧,別寫數(shù)字了
#define SafeAreaBottomHeight (kWJScreenHeight == 812.0 ? 34 : 0)
8.xib和SB適配
介紹之前,我打算介紹一下
系統(tǒng)的安全區(qū)域
的范圍
8.1帶有tabbar和navbar的安全區(qū)域
8.2帶有tabbar和隱藏navbar的安全區(qū)域
重點:安全區(qū)域就是
整個屏幕--導航欄--狀態(tài)欄--tabbar
(自己設(shè)定的安全區(qū)域除外)
xib
的適配齊劉海
和圓角
不會讓我一個一個約束去拖吧,如果你們項目要求適配iOS 9
一下的,小編還沒找到好方法,就該一個一個好好拖了,如果你們不要求適配iOS 9
一下的,那么你就有福音了,比代碼簡單太多了,只需要給view
打開安全區(qū)域
即可。
8.3打開view的安全區(qū)域
8.4設(shè)置頂部約束
域頂部
8.5設(shè)置距離安全區(qū)域頂部距離
8.6比較
9,適配iOS 11 列表的冊數(shù)刪除
在iOS8之后,蘋果官方增加了UITableVIew的右滑操作接口,即新增了一個代理方法(tableView: editActionsForRowAtIndexPath:)和一個類(UITableViewRowAction),代理方法返回的是一個數(shù)組,我們可以在這個代理方法中定義所需要的操作按鈕(刪除、置頂?shù)?,這些按鈕的類就是UITableViewRowAction。這個類只能定義按鈕的顯示文字、背景色、和按鈕事件。并且返回數(shù)組的第一個元素在UITableViewCell的最右側(cè)顯示,最后一個元素在最左側(cè)顯示。從iOS 11開始有了一些改變,首先是可以給這些按鈕添加圖片了,然后是如果實現(xiàn)了以下兩個iOS 11新增的代理方法,將會取代(tableView: editActionsForRowAtIndexPath:)代理方法:
注意:看的有的文章如果在iOS11上面調(diào)用老的刪除,會崩潰,小編測試沒有遇到,還是請大家趁早替換適配吧
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
9.1,右滑和左滑調(diào)用
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let action = UIContextualAction(style: .destructive, title: "Delete") { (action, view, handler) in
handler(true)
}
let configuration = UISwipeActionsConfiguration(actions: [action])
return configuration
}
func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let action = UIContextualAction(style: .normal, title: "Mark") { (action, view, handler) in
handler(true)
}
action.backgroundColor = UIColor.init(red: 254/255.0, green: 175/255.0, blue: 254/255.0, alpha: 1);
let configuration = UISwipeActionsConfiguration(actions: [action])
return configuration
}
10.tableView的頭部試圖和尾部試圖
在iOS11里面有時候在
tableView
的頭部和尾部留白,因為蘋果給滾動試圖加進去了self-sizeing
,開始計算逐步計算contentSize
,默認如果不去實現(xiàn)viewForHeaderInSection
就不會調(diào)用heightForHeaderInSection
,尾部試圖一樣。
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { }
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 0.001 }
如果你不想實現(xiàn)
viewForHeaderInSection
也不想留白,那么只需要你把self-sizeing
自動估高關(guān)閉即可
/// 自動關(guān)閉估算高度,不想估算那個,就設(shè)置那個即可
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
11.UIBarButtonItem的適配
在iOS 11 里面使用
CustomView
創(chuàng)建的item
造成frame
錯亂以及設(shè)置邊距item.width = -20
等失效問題,歸根結(jié)底是因為蘋果更改了iOS11上面uinavigationBar的結(jié)構(gòu)
添加的
right和left
直接添加到navigationBar上面
,并且使用的是frame布局的
有圖我們可以看到, 添加的
right和left
的UIBarButtonItem
并不是直接添加到nagitionBar
上面。而是在外面嵌套了一個uibuttonBarStackView
,而StackView
并不是使用的frame
,而是用的約束來布局,所以必須得用 AutoLayout 了!
/// 適配iOS11 UIBarButtonItem 添加自定義布局
if (@available(iOS 9.0,*)) { /// 強迫癥的朋友這里也是可以寫成11.0
[backbtn.widthAnchor constraintEqualToConstant:size.width].active = true;
[backbtn.heightAnchor constraintEqualToConstant:size.height].active = true;
}
12.無線真機測試
這應該也是
xcode 9
的一個亮點吧,但是速度真的不是很干恭維的。注意手機和電腦必須在同一個局域網(wǎng)內(nèi)
首先使用手機連接xcode之后,打開window->Devices and Simulator->勾選Show as run destination和Connect via network
,這樣就可以無線測試了,以后媽媽再也不用擔心忘記帶線了
13.iOS11 真機地圖
在iOS11地圖適配,在iOS11中,如果使用到地圖,我們就需要在
info
,里面添加NSLocationAlwaysAndWhenInUseUsageDescription
和NSLocationWhenInUseUsageDescription
才可以在ios11
里面正常調(diào)出地圖
后記:無法感謝女朋友喂我吃水果,單身汪一個
后續(xù)小編還會陸續(xù)更新iOS11的適配,如果你在適配的過程中遇到了問題,可以在下面給小編留言,小編會及時回復與你
友情鏈接: