適配iOS11(常用)

導航欄變化

高度變化

在iOS11中導航欄多了一個LargeTitleView,專門專門顯示大字標題。該LargeTitleView的高度為52p

  • iPhoneX之前的機型,默認高度64p,如果顯示大字標題,總高度為20+44+52=116p
  • iPhoneX,statusbar=44,默認高度88p,如果顯示大字標題,總高度為44+44+52=140p

iPhoneX底部還多了一個半角的矩形,使得tabbar多出來了34p的高度

控制大標題的顯示

UINavigationBar中新增了一個BOOL屬性prefersLargeTitles,將該屬性設置為tureNavigationBar就會在整個APP中顯示大標題,如果想要在控制不同頁面大標題的顯示,可以通過設置當前頁面的navigationItemlargeTitleDisplayMode屬性;

navigationItem.largeTitleDisplayMode 

typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {  
/// 自動模式,依賴上一個 item 的特性
UINavigationItemLargeTitleDisplayModeAutomatic,
/// 針對當前 item 總是啟用大標題特性
UINavigationItemLargeTitleDisplayModeAlways,
/// Never 不啟用大標題特性
UINavigationItemLargeTitleDisplayModeNever,
}

導航欄內視圖邊距變化

在iOS11系統中

  • 設置了TitleView
    • iPhone6P以上:左右邊距為12pt
    • iPhone6P以下:左右邊距為8pt
  • 設置了左右navigationBarButton
    • iPhone6P以上:左右邊距為20pt
    • iPhone6P以下:左右邊距為16pt
  • 同時設置了TitleViewnavigationBarButton
    • iPhone6P以上:navigationBarButton的左右邊距為20ptnavigationBarButtonTitleView間距為0pt
    • iPhone6P以下:navigationBarButton的左右邊距為16ptnavigationBarButtonTitleView間距為0pt

automaticallyAdjustsScrollViewInsets 屬性

iOS 11 后 UIViewController 的屬性 automaticallyAdjustsScrollViewInsets,變為了 UIScrollView's contentInsetAdjustmentBehavior。如果發現界面無意中位置偏移了,很可能是這個屬性導致的。

if (@available(iOS 11.0, *)) {
   [UIScrollView appearance].contentInsetAdjustmentBehavior =UIScrollViewContentInsetAdjustmentNever;
   //iOS11 解決SafeArea的問題,同時能解決pop時上級頁面scrollView抖動的問題
} else {
   self.automaticallyAdjustsScrollViewInsets = NO;
}

TableViews :在iOS 11中默認啟用Self-Sizing

在iOS11中,默認開啟了Self-Sizing估算行高機制,我們可以通過實現estimatedRowHeight相關的屬性來展示動態的內容,實現了estimatedRowHeight屬性后,得到的初始contenSize是個估算值,是通過estimatedRowHeight * cell的個數得到的,并不是最終的contenSizetableView不會一次性計算所有的cell的高度了,只會計算當前屏幕能夠顯示的cell個數再加上幾個,滑動時,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的時候,會得到正確的contenSize

Self-Sizing在iOS11下是默認開啟的,Headers,footers, and cells都默認開啟Self-Sizing,所有estimated 高度默認值從iOS11之前的 0 改變為UITableViewAutomaticDimension

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

如果目前項目中沒有使用estimateRowHeight屬性,在iOS11的環境下就要注意了,因為開啟Self-Sizing之后,tableView是使用estimateRowHeight屬性的,這樣就會造成contentSizecontentOffset值的變化,如果是有動畫是觀察這兩個屬性的變化進行的,就會造成動畫的異常,因為在估算行高機制下,contentSize的值是一點點地變化更新的,所有cell顯示完后才是最終的contentSize值。因為不會緩存正確的行高,tableView reloadData的時候,會重新計算contentSize,就有可能會引起contentOffset的變化。iOS11下不想使用Self-Sizing的話,可以通過以下方式關閉:

[UITableView appearance].estimatedRowHeight = 0;
[UITableView appearance].estimatedSectionHeaderHeight = 0;
[UITableView appearance].estimatedSectionFooterHeight = 0;

iOS11下,如果沒有設置estimateRowHeight的值,也沒有設置rowHeight的值,那contentSize計算初始值是 44 * cell的個數.

在iOS11之前,可以只實現heightForHeaderInSection方法,而不實現viewForHeaderInSection方法,但實際上這樣寫是不規范的,只實現了高度,沒有實現View,在iOS11中,這樣寫就會出現問題。

TableViews:separatorInset 擴展

iOS 7 引入separatorInset屬性,用以設置cell的分割線邊距,在 iOS 11 中對其進行了擴展。可以通過新增的UITableViewSeparatorInsetReference枚舉類型的separatorInsetReference屬性來設置separatorInset屬性的參照值。

typedef NS_ENUM(NSInteger, UITableViewSeparatorInsetReference) {  
    UITableViewSeparatorInsetFromCellEdges,   //默認值,表示separatorInset是從cell的邊緣的偏移量
    UITableViewSeparatorInsetFromAutomaticInsets  //表示separatorInset屬性值是從一個insets的偏移量
}

AppIcon

多了一個AppIcon,1024*1024

LanchImage

多了一個iPhoneX

iPhoneX

  1. iPhoneX的狀態欄由原來的 20 變為了 44。這個如果在導航的位置設置自定義的View,在iPhoneX上出問題。會擋住View的顯示。
  2. 啟動頁,如果使用LaunchScreen.storyboard作為啟動頁,需要調整下Top的約束,以前為 -20 ,改為 -44 ;

iPhoneX 分辨率: 1125*2436 ,458 ppi

訪問相冊權限

iOS11 以后使用 NSPhotoLibraryAddUsageDescription

iOS11 之前使用的是 NSPhotoLibraryUsageDescription

詳見:Cocoa Keys

屏幕尺寸變化

  • {375, 812} iPhone X
  • {375, 667} iPhone 8 / iPhone 7 / iPhone 6
  • {414, 736} iPhone 8P / iPhone 7P / iPhone 6P
  • {320, 568} iPhone SE / iPhone 5

設備號變化

case "iPhone10,1", "iPhone10,4":
      return "iPhone 8"
case "iPhone10,2", "iPhone10,5":
      return "iPhone 8 Plus"
case "iPhone10,3", "iPhone10,6":
      return "iPhone X"

參考文章

你可能需要為你的APP適配iOS11

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • 前言 蘋果WWDC開發者大會上,終于發布了大家期待已久的iOS 11,有些新特性功能確實出人意料。不過大的方面蘋果...
    Mr_Say_Yes閱讀 3,338評論 6 15
  • iOS 11 為整個生態系統的 UI 元素帶來了一種更加大膽、動態的新風格。 本文介紹iOS11中在UI方面做了哪...
    阿凡提說AI閱讀 599評論 0 1
  • 本文為作者原創,未經作者允許不得轉載。該文同時發表在騰訊bugly公眾號:https://mp.weixin.qq...
    sonialiu閱讀 101,650評論 74 283
  • 隨著Xcode GM版本發布,適配iOS 11也就提上了日程,總的來說整個適配過程不是很麻煩。建議觀看今年WWDC...
    iOS駱駝閱讀 2,713評論 1 6
  • 一、NavigationBar UIBarItem UIBarItem在iOS11在中新增landscapeIma...
    灰s閱讀 3,832評論 5 11