【轉(zhuǎn)】iOS11 & iPhone X 適配指南

作者:zombieEngineer
鏈接:http://www.reibang.com/p/ef423efd5650
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有。

蘋果WWDC開發(fā)者大會(huì)上迟几,終于發(fā)布了大家期待已久的iOS 11,有些新特性功能確實(shí)出人意料。不過(guò)大的方面蘋果貌似也就 AR 和 GM 機(jī)器學(xué)習(xí)了朽合,9月13日凌晨1點(diǎn),蘋果開了新品發(fā)布會(huì)饱狂,相信大家都已經(jīng)知道Phone X 的劉海了曹步,看起來(lái)不是很雅觀,對(duì)于iOS開發(fā)者來(lái)說(shuō)休讳,適配工作也帶來(lái)了麻煩箭窜,iOS11在新舊API 方面做了新的改動(dòng),未來(lái)App Store就會(huì)出現(xiàn)很多大量的APP更新衍腥,針對(duì)iOS11和iPhone X的適配。
下面針對(duì)已經(jīng)了解的出現(xiàn)的問(wèn)題進(jìn)行適配的說(shuō)明纳猫。
屏幕未充滿婆咸?
相信一部分開發(fā)者已經(jīng)在著手適配iPhone X 和iOS11 了,xcode9測(cè)試版運(yùn)行自己的項(xiàng)目會(huì)發(fā)現(xiàn)項(xiàng)目沒(méi)有充滿屏幕芜辕,上下會(huì)有黑色區(qū)域的情況尚骄,大家別慌,這是沒(méi)有設(shè)置對(duì)應(yīng)的啟動(dòng)圖侵续,iPhone X對(duì)應(yīng)像素 1125 * 2436大家可以自己添加圖片或者準(zhǔn)備一張尺寸:1125 * 2436的啟動(dòng)圖片, 移動(dòng)到LaunchImage的Finder目錄中, 并在LaunchImage中的Contents.json文件中增加 (注意Json格式):

{ 
    "extent" : "full-screen", 
    "idiom" : "iphone", 
    "subtype" : "2436h", 
    "filename" : "圖片名字.png", 
    "minimum-system-version" : "11.0",
     "orientation" : "portrait", 
    "scale" : "3x"
}

UITableview UICollectionView MJRefresh下拉刷新錯(cuò)亂
iOS11 UIScrollView and UITableView的新特性

如果有一些文本位于UI滾動(dòng)視圖的內(nèi)部倔丈,并包含在導(dǎo)航控制器中,現(xiàn)在一般navigationContollers會(huì)傳入一個(gè)contentInset給其最頂層的viewController的scrollView状蜗,在iOS11中進(jìn)行了一個(gè)很大的改變需五,不再通過(guò)scrollView的contentInset屬性了,而是新增了一個(gè)屬性:adjustedContentInset轧坎,通過(guò)下面兩種圖的對(duì)比宏邮,能夠表示adjustContentInset表示的區(qū)域:


圖2.png

圖2.png

contentInsetAdjustmentBehavior屬性有以下幾個(gè)枚舉值

typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) { 
UIScrollViewContentInsetAdjustmentAutomatic, 
UIScrollViewContentInsetAdjustmentScrollableAxes, 
UIScrollViewContentInsetAdjustmentNever, 
UIScrollViewContentInsetAdjustmentAlways,
}
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior;
@property(nonatomic, readonly) UIEdgeInsets adjustedContentInset;//adjustedContentInset值被改變的delegate
- (void)adjustedContentInsetDidChange;
- (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView;

1 automatic 和scrollableAxes一樣,scrollView會(huì)自動(dòng)計(jì)算和適應(yīng)頂部和底部的內(nèi)邊距并且在scrollView 不可滾動(dòng)時(shí),也會(huì)設(shè)置內(nèi)邊距.
2 scrollableAxes 自動(dòng)計(jì)算內(nèi)邊距.
3 never不計(jì)算內(nèi)邊距
4 always 根據(jù)safeAreaInsets 計(jì)算內(nèi)邊距

在我們項(xiàng)目中寫tableview的時(shí)候可以加下面的代碼來(lái)解決此問(wèn)題

if (@available(iOS 11.0, *)) {
 _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; 
_tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);//iPhoneX這里是88 
_tableView.scrollIndicatorInsets = _tableView.contentInset;
}

在我自己項(xiàng)目中缸血,我發(fā)現(xiàn)如果用的系統(tǒng)的導(dǎo)航欄的話距離上部可為0反而加上會(huì)有問(wèn)題蜜氨,列表會(huì)下移你設(shè)置的數(shù)值
_tableView.contentInset = UIEdgeInsetsMake(0, 0, 49, 0); // 實(shí)際項(xiàng)目中這樣也有出現(xiàn)列表的下面可能會(huì)被遮擋(針對(duì)部分項(xiàng)目,視情況而定) 針對(duì)我自己的項(xiàng)目我設(shè)置了向下導(dǎo)航欄的高度看似沒(méi)有問(wèn)題了

tableView cell高度問(wèn)題和頭視圖尾視圖會(huì)有很大間隙
這個(gè)應(yīng)該是UITableView最大的改變捎泻。我們知道在iOS8引入Self-Sizing 之后飒炎,我們可以通過(guò)實(shí)現(xiàn)estimatedRowHeight相關(guān)的屬性來(lái)展示動(dòng)態(tài)的內(nèi)容,實(shí)現(xiàn)了estimatedRowHeight屬性后笆豁,得到的初始contenSize是個(gè)估算值郎汪,是通過(guò)estimatedRowHeight x cell的個(gè)數(shù)得到的赤赊,并不是最終的contenSize,tableView不會(huì)一次性計(jì)算所有的cell的高度了怒竿,只會(huì)計(jì)算當(dāng)前屏幕能夠顯示的cell個(gè)數(shù)再加上幾個(gè)砍鸠,滑動(dòng)時(shí),tableView不停地得到新的cell耕驰,更新自己的contenSize爷辱,在滑到最后的時(shí)候,會(huì)得到正確的contenSize朦肘。

Self-Sizing在iOS11下是默認(rèn)開啟的饭弓,Headers, footers, and cells都默認(rèn)開啟Self-Sizing,所有estimated 高度默認(rèn)值從iOS11之前的 0 改變?yōu)閁ITableViewAutomaticDimension:

@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is UITableViewAutomaticDimension, set to 0 to disable

如果目前項(xiàng)目中沒(méi)有使用estimateRowHeight屬性媒抠,在iOS11的環(huán)境下就要注意了弟断,因?yàn)殚_啟Self-Sizing之后,tableView是使用estimateRowHeight屬性的趴生,這樣就會(huì)造成contentSize和contentOffset值的變化阀趴,如果是有動(dòng)畫是觀察這兩個(gè)屬性的變化進(jìn)行的,就會(huì)造成動(dòng)畫的異常苍匆,因?yàn)樵诠浪阈懈邫C(jī)制下刘急,contentSize的值是一點(diǎn)點(diǎn)地變化更新的,所有cell顯示完后才是最終的contentSize值浸踩。因?yàn)椴粫?huì)緩存正確的行高叔汁,tableView reloadData的時(shí)候,會(huì)重新計(jì)算contentSize检碗,就有可能會(huì)引起contentOffset的變化据块。iOS11下不想使用Self-Sizing的話,可以通過(guò)以下方式關(guān)閉:

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

安全區(qū)域(Safe Area)
從iOS 7以來(lái)折剃,我們?cè)谡麄€(gè)操作系統(tǒng)中都有這些半透明的bars另假,蘋果鼓勵(lì)我們通過(guò)這些bars繪制內(nèi)容,我們是通過(guò)viewController 的edgesForExtendedLayout屬性來(lái)做這些的怕犁。iOS 7 開始浪谴,在 UIViewController中引入的 topLayoutGuide 和 bottomLayoutGuide 在 iOS 11 中被廢棄了!取而代之的就是safeArea的概念因苹,safeArea是描述你的視圖部分不被任何內(nèi)容遮擋的方法苟耻。 它提供兩種方式:safeAreaInsets或safeAreaLayoutGuide來(lái)提供給你safeArea的參照值,即 insets 或者 layout guide扶檐。 safeArea區(qū)域如圖所示:


圖3.png

圖3.png

iOS11 為UIViewController和UIView增加了一個(gè)新的方法 - (void)viewSafeAreaInsetsDidChange;
這個(gè)方法如名字一樣 在安全區(qū)域改變后會(huì)被調(diào)用, 我們可以在需要適配的UIViewController和UIView中重寫這個(gè)方法, 并且在這個(gè)方法中來(lái)根據(jù)safeAreaInsets屬性更新子視圖控件的布局位置.
這里有一點(diǎn)要注意的是當(dāng)UIViewController調(diào)用- (void)viewDidLoad時(shí)它的所有子視圖的safeAreaInsets屬性都等于UIEdgeInsetsZero, 也就是說(shuō)在- (void)viewSafeAreaInsetsDidChange;方法調(diào)用前 是無(wú)法通過(guò)當(dāng)前視圖控制器的子視圖獲取到safeAreaInsets的, 不過(guò)獲取當(dāng)前window對(duì)象的safeAreaInsets屬性用來(lái)計(jì)算也是可以的, 但是不建議這么做, 一個(gè)視圖控制器的子視圖的處理當(dāng)然要以它所在的控制器為準(zhǔn).
(void)viewSafeAreaInsetsDidChange在UIViewController中第一次調(diào)用的時(shí)間是在- (void)viewWillAppear:(BOOL)animated調(diào)用之后, 在- (void)viewWillLayoutSubviews調(diào)用之前.

當(dāng)然如果你要改變一個(gè)UIViewController的safeAreaInsets值, 可以通過(guò)設(shè)置addtionalSafeAreaInsets屬性來(lái)實(shí)現(xiàn), 例如你要自定義一些特殊的樣式時(shí).
如果你改變了一個(gè)UIViewController的safeAreaInsets屬性值, - (void)viewSafeAreaInsetsDidChange也會(huì)被調(diào)用.
采用SB或者xib 布局 Autolayout 視圖的 top 和 bottom 一般參照的是 Top Layout Guide 和 Bottom Layout Guide. 但是iOS11 廢棄了改用安全區(qū)域(SafeArea)做參考來(lái)做適配


圖4.png

圖4.png

圖5.png

圖5.png

圖6.png

圖6.png

圖7.png

圖7.png

圖8.png

圖8.png

滑動(dòng)操作
在iOS8之后凶杖,蘋果官方增加了UITableVIew的右滑操作接口,即新增了一個(gè)代理方法(tableView: editActionsForRowAtIndexPath:)和一個(gè)類(UITableViewRowAction)款筑,代理方法返回的是一個(gè)數(shù)組智蝠,我們可以在這個(gè)代理方法中定義所需要的操作按鈕(刪除腾么、置頂?shù)?,這些按鈕的類就是UITableViewRowAction杈湾。這個(gè)類只能定義按鈕的顯示文字解虱、背景色、和按鈕事件漆撞。并且返回?cái)?shù)組的第一個(gè)元素在UITableViewCell的最右側(cè)顯示殴泰,最后一個(gè)元素在最左側(cè)顯示。從iOS 11開始有了一些改變浮驳,首先是可以給這些按鈕添加圖片了悍汛,然后是如果實(shí)現(xiàn)了以下兩個(gè)iOS 11新增的代理方法,將會(huì)取代(tableView: editActionsForRowAtIndexPath:)代理方法:

// Swipe actions//
 These methods supersede -editActionsForRowAtIndexPath: if implemented
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath

這兩個(gè)代理方法返回的是UISwipeActionsConfiguration類型的對(duì)象至会,創(chuàng)建該對(duì)象及賦值可看下面的代碼片段:

- ( UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
//刪除 
UIContextualAction *deleteRowAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"delete" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
[self.titleArr removeObjectAtIndex:indexPath.row]; 
completionHandler (YES); 
}]; 
deleteRowAction.image = [UIImage imageNamed:@"icon_del"];
deleteRowAction.backgroundColor = [UIColor blueColor]; 
UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[deleteRowAction]]; 
return config;
}

創(chuàng)建UIContextualAction對(duì)象時(shí)离咐,UIContextualActionStyle有兩種類型,如果是置頂奉件、已讀等按鈕就使用UIContextualActionStyleNormal類型宵蛀,delete操作按鈕可使用UIContextualActionStyleDestructive類型,當(dāng)使用該類型時(shí)县貌,如果是右滑操作糖埋,一直向右滑動(dòng)某個(gè)cell,會(huì)直接執(zhí)行刪除操作窃这,不用再點(diǎn)擊刪除按鈕,這也是一個(gè)好玩的更新征候。
滑動(dòng)操作這里還有一個(gè)需要注意的是杭攻,當(dāng)cell高度較小時(shí),會(huì)只顯示image疤坝,不顯示title兆解,當(dāng)cell高度夠大時(shí),會(huì)同時(shí)顯示image和title跑揉。我寫demo測(cè)試的時(shí)候锅睛,因?yàn)槊總€(gè)cell的高度都較小,所以只顯示image历谍,然后我增加cell的高度后现拒,就可以同時(shí)顯示image和title了。見(jiàn)下圖對(duì)比:


圖9.png

圖9.png

iOS 11獲取設(shè)備名稱

if ([platform isEqualToString:@"iPhone10,1"]) return @"iPhone 8";
if ([platform isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
if ([platform isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus";
if ([platform isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
if ([platform isEqualToString:@"iPhone10,3"]) return @"iPhone X";
if ([platform isEqualToString:@"iPhone10,6"]) return @"iPhone X";

目前暫時(shí)遇到的問(wèn)題解決望侈,還是等20號(hào)正式版推出再做詳細(xì)的適配和更改印蔬,畢竟測(cè)試版的問(wèn)題和bug 還是很多的。
iPhone X相關(guān)適配鏈接
Creating apps for iPhone X
Updating Your App for iOS 11 - WWDC 2017 - Session 204 - iOS
Human Interface Guidelines

作者:zombieEngineer鏈接:http://www.reibang.com/p/ef423efd5650來(lái)源:簡(jiǎn)書著作權(quán)歸作者所有脱衙。感謝作者的及時(shí)分享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侥猬,一起剝皮案震驚了整個(gè)濱河市例驹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌退唠,老刑警劉巖鹃锈,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瞧预,居然都是意外死亡屎债,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門松蒜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扔茅,“玉大人,你說(shuō)我怎么就攤上這事秸苗≌倌龋” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵惊楼,是天一觀的道長(zhǎng)玖瘸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)檀咙,這世上最難降的妖魔是什么雅倒? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮弧可,結(jié)果婚禮上蔑匣,老公的妹妹穿的比我還像新娘。我一直安慰自己棕诵,他們只是感情好裁良,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著校套,像睡著了一般价脾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笛匙,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天侨把,我揣著相機(jī)與錄音,去河邊找鬼妹孙。 笑死秋柄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蠢正。 我是一名探鬼主播华匾,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蜘拉?” 一聲冷哼從身側(cè)響起萨西,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旭旭,沒(méi)想到半個(gè)月后谎脯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡持寄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年源梭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稍味。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡废麻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出模庐,到底是詐尸還是另有隱情烛愧,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布掂碱,位于F島的核電站怜姿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疼燥。R本人自食惡果不足惜沧卢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醉者。 院中可真熱鬧但狭,春花似錦、人聲如沸撬即。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)搞莺。三九已至,卻和暖如春掂咒,著一層夾襖步出監(jiān)牢的瞬間才沧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工绍刮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留温圆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓孩革,卻偏偏與公主長(zhǎng)得像岁歉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 聲明:這篇文章轉(zhuǎn)載 *zombieEngineer * [Cocoa開發(fā)者社區(qū)]僅供大家參考學(xué)習(xí)使用锅移,也方便自己...
    追逐_chase閱讀 572評(píng)論 0 0
  • iOS 11 為整個(gè)生態(tài)系統(tǒng)的 UI 元素帶來(lái)了一種更加大膽熔掺、動(dòng)態(tài)的新風(fēng)格。 本文介紹iOS11中在UI方面做了哪...
    阿凡提說(shuō)AI閱讀 586評(píng)論 0 1
  • 一非剃、NavigationBar UIBarItem UIBarItem在iOS11在中新增landscapeIma...
    灰s閱讀 3,790評(píng)論 5 11
  • 隨著Xcode GM版本發(fā)布置逻,適配iOS 11也就提上了日程,總的來(lái)說(shuō)整個(gè)適配過(guò)程不是很麻煩备绽。建議觀看今年WWDC...
    iOS駱駝閱讀 2,689評(píng)論 1 6
  • 前言 蘋果WWDC開發(fā)者大會(huì)上券坞,終于發(fā)布了大家期待已久的iOS 11,有些新特性功能確實(shí)出人意料肺素。不過(guò)大的方面蘋果...
    Mr_Say_Yes閱讀 3,296評(píng)論 6 15