導航欄變化
高度變化
在iOS11中導航欄多了一個LargeTitleView
,專門專門顯示大字標題。該LargeTitleView
的高度為52p。
- iPhoneX之前的機型,默認高度64p,如果顯示大字標題,總高度為20+44+52=116p
- iPhoneX,statusbar=44,默認高度88p,如果顯示大字標題,總高度為44+44+52=140p
iPhoneX底部還多了一個半角的矩形,使得tabbar多出來了34p的高度
控制大標題的顯示
在UINavigationBar
中新增了一個BOOL屬性prefersLargeTitles
,將該屬性設置為ture
,NavigationBar
就會在整個APP中顯示大標題,如果想要在控制不同頁面大標題的顯示,可以通過設置當前頁面的navigationItem
的largeTitleDisplayMode
屬性;
navigationItem.largeTitleDisplayMode
typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {
/// 自動模式,依賴上一個 item 的特性
UINavigationItemLargeTitleDisplayModeAutomatic,
/// 針對當前 item 總是啟用大標題特性
UINavigationItemLargeTitleDisplayModeAlways,
/// Never 不啟用大標題特性
UINavigationItemLargeTitleDisplayModeNever,
}
導航欄內視圖邊距變化
在iOS11系統中
- 設置了
TitleView
:-
iPhone6P
以上:左右邊距為12pt
-
iPhone6P
以下:左右邊距為8pt
-
- 設置了左右
navigationBarButton
:-
iPhone6P
以上:左右邊距為20pt
-
iPhone6P
以下:左右邊距為16pt
-
- 同時設置了
TitleView
和navigationBarButton
:-
iPhone6P
以上:navigationBarButton
的左右邊距為20pt
,navigationBarButton
與TitleView
間距為0pt
-
iPhone6P
以下:navigationBarButton
的左右邊距為16pt
,navigationBarButton
與TitleView
間距為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
的個數得到的,并不是最終的contenSize
,tableView
不會一次性計算所有的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
屬性的,這樣就會造成contentSize
和contentOffset
值的變化,如果是有動畫是觀察這兩個屬性的變化進行的,就會造成動畫的異常,因為在估算行高機制下,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
-
iPhoneX
的狀態欄由原來的 20 變為了 44。這個如果在導航的位置設置自定義的View
,在iPhoneX
上出問題。會擋住View
的顯示。 - 啟動頁,如果使用
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"