iOS11的特性

作者:Hflydragon
鏈接:https://www.jianshu.com/p/e15150107018
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

1.UIKit Bars的改版

1.在瀏覽功能上的大標題視圖(向上滑動後標題會回到原來的UI效果)、橫屏狀態下tab上的文字和icon會變爲左右排列。

橫屏.png

當然,如果圖標和文字覺得太小了,可以長按item進行放大操作。具體只需要添加代碼

放大.png

2. iOS11導航欄

  1. 設置導航欄大標題: navigationBar.prefersLargeTitles,顯示的時機可以用 navigationItem.largeTitleDisplayMode 設置枚舉值。
  2. 設置導航欄搜索控制器
searchController  : self.navigationItem.searchController = searchController

3.上面設置titleViewcustomView時出現寬度縮小的問題 (這個網上提到了這個問題,但是我自定義代碼並沒有出現這個情況)

3.調整相冊權限的key

NSPhotoLibraryUsageDescription改爲 NSPhotoLibraryAddUsageDescription
。(beta版本好像又改過來了,我現在沒有調整key也是可以訪問相冊的)

4.近場通訊

首先也要在info.plist配置NFCReaderUsageDescription

5.無線配備

6. 棄用API,scrollview和tableview的改變

iOS11棄用了automaticallyAdjustsScrollViewInsets
屬性,新增contentInsetAdjustmentBehavior
來替代它。這可能使得一些刷新出現頭部錯亂。contentInsetAdjustmentBehavior其實是一個枚舉值。用來管理adjustedContentInset

  • -automaticscrollableAxes一樣,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的topLayoutGuidebottomLayoutGuide方法進行約束,但是在iOS11中被廢棄了,引用了一個新的概念。safeArea,它提供兩種方式:safeAreaInsetssafeAreaLayoutGuide來提供給你safeArea的參照值,即 insets或者 layout guide。同時如果改變Insets時會獲得兩個回調

UIView.safeAreaInsetsDidChange()
UIViewController.viewSafeAreaInsetsDidChange()

這個iOS的safe Area涉及到的第三方庫有mansoryIQkeyboard 所以可能這兩個庫也會進行一些適配

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));

layoutMarginsUIEdgeInsets結構體類型的屬性:

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。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章