鏈接:https://www.jianshu.com/p/e15150107018
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
1.UIKit Bars的改版
1.在瀏覽功能上的大標題視圖(向上滑動後標題會回到原來的UI效果)、橫屏狀態下tab上的文字和icon會變爲左右排列。
當然,如果圖標和文字覺得太小了,可以長按item進行放大操作。具體只需要添加代碼
2. iOS11導航欄
- 設置導航欄大標題:
navigationBar.prefersLargeTitles
,顯示的時機可以用navigationItem.largeTitleDisplayMode
設置枚舉值。 - 設置導航欄搜索控制器
searchController : self.navigationItem.searchController = searchController
3.上面設置titleView
爲customView
時出現寬度縮小的問題 (這個網上提到了這個問題,但是我自定義代碼並沒有出現這個情況)
3.調整相冊權限的key
NSPhotoLibraryUsageDescription
改爲 NSPhotoLibraryAddUsageDescription
。(beta版本好像又改過來了,我現在沒有調整key也是可以訪問相冊的)
4.近場通訊
首先也要在info.plist配置NFCReaderUsageDescription
5.無線配備
6. 棄用API,scrollview和tableview的改變
iOS11棄用了automaticallyAdjustsScrollViewInsets
屬性,新增contentInsetAdjustmentBehavior
來替代它。這可能使得一些刷新出現頭部錯亂。contentInsetAdjustmentBehavior
其實是一個枚舉值。用來管理adjustedContentInset
- -
automatic
和scrollableAxes
一樣,scrollView
會自動計算和適應頂部和底部的內邊距並且在scrollView
不可滾動時,也會設置內邊距. - -
scrollableAxes
自動計算內邊距. - -
never
不計算內邊距 - -
always
根據safeAreaInsets
計算內邊距
我們這裏要設置爲 never
,所以我們的OC代碼可以這樣寫:
聲明tableView的位置 添加下面代碼
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
self.tableView.contentInset = UIEdgeInsetsMake(0, 0,0, 0);
self.tableView.scrollIndicatorInsets = _tableView.contentInset;
}
在iOS8引入
Self-Sizing
之後,我們可以通過實現estimatedRowHeight
相關的屬性來展示動態的內容。Self-Sizing
在iOS11下是默認開啓的,Headers,Footers, and cells都默認開啓Self-Sizing
,所有estimated
高度默認值從iOS11之前的 0 改變爲UITableViewAutomaticDimension
.
如果目前項目中沒有使用estimateRowHeight
屬性,在iOS11的環境下就要注意了,因爲開啓Self-Sizing
之後,tableView是使用estimateRowHeight
屬性的,就會可能會使代理方法設置高度失效.
通過以下方法進行關閉:
Table Views:separatorInset 擴展
iOS 7 引入separatorInset
屬性,用以設置 cell 的分割線邊距,在 iOS 11 中對其進行了擴展。可以通過新增的UITableViewSeparatorInsetReference
枚舉類型的separatorInsetReference
屬性來設置separatorInset
屬性的參照值。
typedef NS_ENUM(NSInteger, UITableViewSeparatorInsetReference) {
UITableViewSeparatorInsetFromCellEdges, //默認值,表示separatorInset是從cell的邊緣的偏移量
UITableViewSeparatorInsetFromAutomaticInsets //表示separatorInset屬性值是從一個insets的偏移量
}
7.拖放
8.文件管理
9.tableView右滑操作
增加了兩個代理方法來取代原來的代理方法(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
創建 UIContextualAction
對象時,UIContextualActionStyle
有兩種類型,如果是置頂、已讀等按鈕就使用UIContextualActionStyleNormal
類型,delete操作按鈕可使用UIContextualActionStyleDestructive
類型,當使用該類型時,如果是右滑操作,一直向右滑動某個cell,會直接執行刪除操作,不用再點擊刪除按鈕。
10.Safe Area
以前做懸浮(支付,頭部標題等),系統爲我們提供了viewController的topLayoutGuide
和bottomLayoutGuide
方法進行約束,但是在iOS11中被廢棄了,引用了一個新的概念。safeArea
,它提供兩種方式:safeAreaInsets
或safeAreaLayoutGuide
來提供給你safeArea
的參照值,即 insets
或者 layout guide
。同時如果改變Insets
時會獲得兩個回調
UIView.safeAreaInsetsDidChange()
UIViewController.viewSafeAreaInsetsDidChange()
這個iOS的safe Area
涉及到的第三方庫有mansory
和 IQkeyboard
所以可能這兩個庫也會進行一些適配
11.UIToolbar and UINavigationBar— Layout
在 iOS 11 中,當蘋果進行所有這些新特性時,也進行了其他的優化,針對 UIToolbar 和 UINavigaBar 做了新的自動佈局擴展支持,自定義的bar button items、自定義的title都可以通過layout來表示尺寸。 需要注意的是,你的constraints需要在view內部設置,所以如果你有一個自定義的標題視圖,你需要確保任何約束只依賴於標題視圖及其任何子視圖。當你使用自動佈局,系統假設你知道你在做什麼。
12. 管理margins 和 insets
基於約束的Auto Layout,使我們搭建能夠動態響應內部和外部變化的用戶界面。Auto Layout爲每一個view都定義了margin。margin指的是控件顯示內容部分的邊緣和控件邊緣的距離。 可以用layoutMargins
或者layoutMarginsGuide
屬性獲得view的margin,margin是視圖內部的一部分。layoutMargins允許獲取或者設置UIEdgeInsets
結構的margin。layoutMarginsGuide
則獲取到只讀的UILayoutGuide
對象。
在iOS11新增了一個屬性:directional layout margins
,該屬性是NSDirectionalEdgeInsets
結構體類型的屬性:
typedef struct NSDirectionalEdgeInsets {
CGFloat top, leading, bottom, trailing;
} NSDirectionalEdgeInsets API_AVAILABLE(ios(11.0),tvos(11.0),watchos(4.0));
layoutMargins
是UIEdgeInsets
結構體類型的屬性:
typedef struct UIEdgeInsets {
CGFloat top, left, bottom, right;
} UIEdgeInsets;
從上面兩種結構體的對比可以看出,NSDirectionalEdgeInsets
屬性用leading 和 trailing 取代了之前的 left 和 right。directional layout margins
屬性的說明如下:
directionalLayoutMargins.leading is used on the left when the user interface direction is LTR and on the right for RTL.
Vice versa for directionalLayoutMargins.trailing.
例子:當你設置了trailing = 30;當在一個right to left 語言下trailing的值會被設置在view的左邊,可以通過layout margins的left屬性讀出該值。
如下圖所示:
還有其他一些更新。自從引入layout margins
,當將一個view添加到viewController時,viewController會修復view的layoutMargins
爲UIKit定義的一個值,這些調整對外是封閉的。從iOS11開始,這些不再是一個固定的值,它們實際是最小值,你可以改變你的view的layoutMargins爲任意一個更大的值。而且,viewController新增了一個屬性:viewRespectsSystemMinimumLayoutMargins,如果你設置該屬性爲”false”,你就可以改變你的layout margins爲任意你想設置的值,包括0。