亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

關于iOS 11的一些新特性適配實踐總結

2019-10-21 18:43:51
字體:
來源:轉載
供稿:網友

前言

iOS 11 已經發布了一段時間了,隨手記團隊也早早的完成了適配。在這里,我們做了點總結,與大家一起分享一下關于 iOS 11 一些新特性的適配。

UIView & UIViewController

Layout Margins

iOS 11 中,官方提供了一種新的布局方法——通過 layout margins 進行布局。官方文檔 Positioning Content Within Layout Margins 稱,使用這種布局可以保證各個 content 之間不會相互覆蓋。

總的來說,layout margins 可以視作視圖的內容和內容之間的空隙。它由每個邊的 insetValues 組成,分別是 top, bottom, leading and trailing. 對應的是上、下、左、右。

ios11新特性適配,ios11新特性,ios11適配

Auto Layout with Layout Margins

如果使用 Auto Layout 進行布局,并希望約束遵循 layout margins,那么必須要在 Xcode 中打開 Constrain to margins 選項。這樣,如果父視圖的 layout margins 改變,那么所有綁定于父視圖 margins 的子視圖都會更新布局。

ios11新特性適配,ios11新特性,ios11適配

注意

如果沒有開啟這個選項,那么所有建立的約束都會依賴于父視圖的 bounds.

Manually Layout with Layout Margins

如果沒有使用 Auto Layout, 而是通過設置 frame 布局的話,要遵循 layout margins 也并不困難,只需要在布局計算時使用 directionalLayoutMargins 這個屬性。

var directionalLayoutMargins: NSDirectionalEdgeInsets { get set }

官方文檔中闡述道,對于 view controller 的根視圖,它的 directionalLayoutMargins 默認值是由 systemMinimumLayoutMargins和SafeAreaInsets 決定的。在 iPhone X 下打印根視圖的這三個屬性可以看到它們的關系。

override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print("SafeAreaInsets :" + "/(self.view.safeAreaInsets)") print("systemMinimumLayoutMargins :" + "/(self.systemMinimumLayoutMargins)") print("directionalLayoutMargins: " + "/(self.view.directionalLayoutMargins)")  // SafeAreaInsets :UIEdgeInsets(top: 88.0, left: 0.0, bottom: 34.0, right: 0.0) // systemMinimumLayoutMargins :NSDirectionalEdgeInsets(top: 0.0, leading: 16.0, bottom: 0.0, trailing: 16.0) // directionalLayoutMargins: NSDirectionalEdgeInsets(top: 88.0, leading: 16.0, bottom: 34.0, trailing: 16.0)}

結果顯而易見,directionalLayoutMargins 的默認值由 systemMinimumLayoutMargins 和 safeAreaInsets 組成。

注意

systemMinimumLayoutMargins 屬性是否可用由 view controller 的布爾值屬性viewRespectsSystemMinimumLayoutMargins決定,默認為true.

如果手動對 directionalLayoutMargins 賦值,那么在 viewRespectsSystemMinimumLayoutMargins 開啟的情況下,系統會比較賦值后的 directionalLayoutMargins 和 systemMinimumLayoutMargins ,并取其較大值作為最終的 margins。

print("systemMinimumLayoutMargins :" + "/(self.systemMinimumLayoutMargins)")print("origin directionalLayoutMargins: " + "/(self.view.directionalLayoutMargins)")// 這里把 leading 和 trailing 分別賦值為相對于 systemMinimumLayoutMargins 的較大值20和較小值10self.view.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10)print("assigned directionalLayoutMargins: " + "/(self.view.directionalLayoutMargins)")// 打印日志可見只有 leading 的值改變為手動賦的值,trailing 依然遵循于 systemMinimumLayoutMarginssystemMinimumLayoutMargins :NSDirectionalEdgeInsets(top: 0.0, leading: 16.0, bottom: 0.0, trailing: 16.0)origin directionalLayoutMargins: NSDirectionalEdgeInsets(top: 88.0, leading: 16.0, bottom: 34.0, trailing: 16.0)assigned directionalLayoutMargins: NSDirectionalEdgeInsets(top: 88.0, leading: 20.0, bottom: 34.0, trailing: 16.0)

注意

如果不希望受到systemMinimumLayoutMargins的影響,那么把 view controller 的viewRespectsSystemMinimumLayoutMargins設為false即可.

Navigation bar

進入了 iOS 11,蘋果為提供了更為漂亮和醒目的大標題的樣式,如果想開啟這樣的功能,其實很簡單。
只需要將 navigation bar 中的 prefersLargeTitles 置為 true 即可,這樣便自動有了來自 iOS 11 中的大標題的樣式。

self.navigationController.navigationBar.prefersLargeTitles = true

這里可以注意到,prefersLargeTitles 是配置在的 navigation controller 中的 navigation bar 中的。也就是說該 navigation controller 容器中的所有的 view controller 在此配置之后,都會受到影響。所以如果你要在當前的 navigation controller 中推入一個新的 view controller 的話,那么該 view controller 也會是大標題。因此為了避免這個問題,UIKit 為 UINavigationItem 提供了 largeTitleDisplayMode 屬性。

該屬性默認為 UINavigationItem.LargeTitleDisplayMode.automatic, 即保持與前面已經顯示過的 navigation item 一致的樣式。 如果想在后來的一個 view controller 避免大標題樣式那么可以這么配置:

self.navigationItem.largeTitleDisplayMode = .never

除了大標題以外,在 iOS 11 中,UIKit 還為 navigation item 提供了便于管理搜索的接口。
具體參考如下:

self.navigationItem.searchController = self.searchControllerself.navigationItem.hidesSearchBarWhenScrolling = true

在配置好你的 search controller 之后便可以直接提供給 navigation item 的 searchController屬性上,這樣的便能夠在導航欄看到一個漂亮的搜索框了。

此外還可以給 navigation item 中的屬性 hidesSearchBarWhenScrolling 設置為 true, 他可以使你 view controller 中管理的 scroll view 在滑動的時候自動隱藏 search bar.

Scroll view

如果使用過 view controller 管理過 scroll view 的話,想必對 automaticallyAdjustsScrollViewInsets 這個屬性一定不陌生。在 iOS 11 之前,該屬性可以讓 view controller 自動管理 scroll view 中的 content inset. 但是,在實際在開發的過程中,這樣的自動管理的方式會帶來麻煩,尤其是一些在 content inset 需要動態調整的情況。

為此,在 iOS 11, UIKit 廢棄了 automaticallyAdjustsScrollViewInsets 屬性,并將該的職責轉移到 scroll view 本身。因此,在 iOS 11 中,為了解決這個問題,有兩個 scroll view 的新屬性。一個是用于管理調整 content inset 行為的屬性 contentInsetAdjustmentBehavior, 另一個是獲取調整后的填充的屬性 adjustedContentInset. 同時,UIScrollViewDelegate 也提供了新的代理方法,以方便開發者獲取 inset 變化的時機:

optional func scrollViewDidChangeAdjustedContentInset(_ scrollView: UIScrollView)

至此,對于這個「自動為開發者設置 inset」 的特性,蘋果算是提供了相當完備的接口了。

不過作為開發者的我們要注意的是,如果對原本自動設置 contentInset 屬性的行為有依賴,在新的 iOS 11 的適配中,可能得做出調整。

此外,為了便于開發者在 scroll view 中使用 Auto Layout. UIKit 還提供了兩個新的屬性。一個是 contentLayoutGuide, 它用來獲取當前在 scroll view 內的內容的 layout guides. 而另一個是 frameLayoutGuide, 他用來獲取實際內容的 layout guides. 這樣說有點繁瑣,還是看 WWDC 的原圖吧:

ios11新特性適配,ios11新特性,ios11適配

Table view

實際上對于 table view 而言,其最大的更新就在于新的特性 Drag and Drop 了吧。但是這個特性在適配中暫時不需要考慮,本文就不介紹了,讓我們一起來看看其他有意思的變化。

首先是在 iOS 11 中,table view 默認開啟了 self-sizing, 可以注意到 estimatedRowHeight, estimatedSectionHeaderHeight 以及 estimatedSectionFooterHeight 都被默認設置為 UITableViewAutomaticDimension. 但是我們知道,如果原本已經實現 tableView:heightForRowAtIndexPath: 之類的方法并返回了高度,那么在布局方面是不會有影響的,這對 iOS 11 適配而言是個好消息。

在 iOS 11 中,有了新的 layout margins 的概念,因此 UIKit 也為 separator inset 做了額外的補充?,F在 separator inset 可以有兩個來源,一個是從 cell 的邊緣開始 (UITableViewSeparatorInsetReference.fromCellEdges) ,另一個是從 table view 默認的填充開始 (UITableViewSeparatorInsetReference.fromAutomaticInsets)。其中,默認的填充由 table view 的 layout margins 進行控制。

此外,iOS 11 還為 table view 添加了更多的滑動操作的控制能力。分別可以通過以下兩個 UITableViewDelegate 的方法

實現:

func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

我們可以注意到兩個方法均要求返回一個 UISwipeActionsConfiguration 實例。為構造這個實例,我們還需要構造一個由 UIContextualAction 實例組成的數組。UIContextualAction 與原本的 UITableViewRowAction 大致類似,但是要注意在 contextual action 的參數 handler 中,我們需要調用 handler 參數中的 completionHandler 才能完成操作。從這一點我們可以看到,似乎在新的 action 中,我們可以做一些異步操作相關的事情。

下面是一個刪除操作的示例:

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let contextualAction = UIContextualAction.init(style: .destructive, title: "Delete") { (style, title, completionHandler) in  // 刪除指定的數據  completionHandler(true) }  let actionsConfiguration = UISwipeActionsConfiguration.init(actions: [contextualAction]) return actionsConfiguration}

在 swipe actions configuration 中,我們還需要注意一點,那就是新的 performsFirstActionWithFullSwipe 屬性。通過開啟這個屬性的配置(默認開啟),我們可以為第一個動作提供 full swipe 操作 (一種通過過度滑動從而觸發動作的交互) 。

如果僅僅實現了以往的編輯的代理方法,在 iOS 11 中,對于第一個動作將會默認支持 full swipe, 且不能關閉。

Face ID

如果已經做過了 Touch ID 那么實際上適配 Face ID 便并不難了。即便是不做任何的改動,估計 Face ID 也是可以直接使用的(寫作時, iPhone X 還未上市),當然相關的體驗肯定會打點折扣,畢竟文案以及相關的提示操作還是在僅有 Touch ID 的前提下實現的。

與以往一樣,可以通過 LAContext 類實現生物識別認證。不過需要注意的是,因為支持了新的 Face ID 認證,蘋果便為 LAContext 類添加了新的接口 biometryType 用于區分 Touch ID 以及 Face ID。同時,以往僅涵蓋 Touch ID 的錯誤類型,也在 iOS 11 中廢棄了,相應的,蘋果提供了新的更通用的錯誤類型予以替代。

IOS 11 下適配UITableView

UIScrollView及其子類在IOS 11之前的版本UI顯示完全正常,但是在IOS 11上面會顯示奇葩的界面。

 (1)先看一下UITablevIew。

原本在VC里面的automaticallyAdjustsScrollViewInsets竟然過期了,在IOS 11下 APPLE推薦使用UIScrollView的contentInsetAdjustmentBehavior屬性進行設置自動計算滾動視圖的內容邊距。

@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets

在IOS11的SDK下,UIScrollView的這個屬性

@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior //這個屬性是一個枚舉類型的{UIScrollViewContentInsetAdjustmentAutomatic,//scrollView會自動計算和適應頂部和底部的內邊距并且在scrollView 不可滾動時,也會設置內邊距.UIScrollViewContentInsetAdjustmentScrollableAxes, //自動適應邊距UIScrollViewContentInsetAdjustmentNever, //和 automaticallyAdjustsScrollViewInsets=NO有著同樣的效果,不計算內邊距UIScrollViewContentInsetAdjustmentAlways//根據safeAreaInsets (安全區域)計算內邊距 }

所以,在IOS 11 下,需要設置ScrollView:

 self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

如果需要全局設置的話,需要這么設置:

if (@available(iOS 11.0, *)) {  [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];}

這樣設置后使用UITableview 、UICollectionView、UIScrollview的時候就不需要再單獨設置該屬性了,因為UIView以及他的子類都是遵循UIAppearance協議的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

Reference

  • Positioning Content Within Layout Margins
  • directionalLayoutMargins
  • systemMinimumLayoutMargins
  • SafeAreaInsets

注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久国产综合久久91精品网站| 国产精品丝袜白浆摸在线| 91精品国产免费久久久久久| 欧美电影院免费观看| 欧美激情视频免费观看| 欧美老少做受xxxx高潮| 亚洲国模精品一区| 2018国产精品视频| 5566日本婷婷色中文字幕97| 日韩精品高清在线观看| 超碰97人人做人人爱少妇| 久久亚洲精品国产亚洲老地址| 国产精品精品视频| 成人羞羞国产免费| 日韩高清av一区二区三区| 亚洲精品丝袜日韩| 亚洲天堂影视av| 国产精品久久久久久久电影| 欧美猛少妇色xxxxx| 中文字幕日韩在线播放| 亚洲最大成人在线| 精品国产美女在线| 91黑丝在线观看| 亚洲精品久久视频| 97视频在线观看视频免费视频| 91在线免费网站| 欧美高跟鞋交xxxxhd| 欧美夜福利tv在线| 中文字幕亚洲一区二区三区| 久久久久久com| 亚洲欧美视频在线| 色综合色综合网色综合| 欧美成人一区二区三区电影| 青青草国产精品一区二区| 美女久久久久久久| 91色琪琪电影亚洲精品久久| 色综合男人天堂| 国产美女主播一区| 九色91av视频| 91精品久久久久| 中文字幕欧美日韩在线| 亚洲综合在线中文字幕| 久久久久久亚洲精品不卡| 国产精品草莓在线免费观看| 日韩视频免费观看| 伊人精品在线观看| 国产在线观看不卡| 91在线观看免费网站| 日韩亚洲成人av在线| 欧美成人免费小视频| 国产噜噜噜噜久久久久久久久| 91老司机精品视频| 动漫精品一区二区| 一区二区三区精品99久久| 日韩在线精品一区| 一本一道久久a久久精品逆3p| 日韩成人在线电影网| 在线观看国产精品淫| 欧美一区深夜视频| 日韩视频免费在线观看| 日韩av在线免费播放| 中文字幕亚洲无线码a| 国产亚洲精品久久久久动| 欧美日韩国产在线看| 成人av在线亚洲| 久久99精品久久久久久琪琪| 成人字幕网zmw| 久久久之久亚州精品露出| 国产精品成人va在线观看| 在线成人激情视频| 欧美激情视频在线免费观看 欧美视频免费一| 国产日韩中文在线| 久久影视三级福利片| 97在线日本国产| 欧美另类极品videosbest最新版本| 日韩不卡在线观看| 亚洲国产日韩欧美在线动漫| 亚洲自拍偷拍福利| 日韩中文字幕国产精品| 91久久久久久久久久| 亚洲国产高潮在线观看| 国产精品自拍网| 欧美成人h版在线观看| 亚洲成人av片| 欧美疯狂xxxx大交乱88av| 日本久久久久久| 91性高湖久久久久久久久_久久99| 国产精品美女视频网站| 国产精品福利无圣光在线一区| 欧美激情精品久久久久久免费印度| 97色伦亚洲国产| 日韩精品在线观看一区二区| 亚洲视频免费一区| 日韩av在线免费观看一区| 国产精品伦子伦免费视频| 精品欧美国产一区二区三区| 亚洲成人久久久| 欧美午夜宅男影院在线观看| 国内精品久久久久伊人av| 69国产精品成人在线播放| 国产成人欧美在线观看| 岛国av一区二区在线在线观看| 久久久精品2019中文字幕神马| 7777精品久久久久久| 清纯唯美日韩制服另类| 久久久国产一区| 国产精品福利网| 国产精品高潮呻吟久久av无限| 色综合久综合久久综合久鬼88| 91超碰中文字幕久久精品| 亚洲精品资源在线| 国产a∨精品一区二区三区不卡| 亚洲国产另类 国产精品国产免费| 欧美精品在线播放| 成人在线国产精品| 欧美日韩中文字幕日韩欧美| 国产欧美日韩综合精品| xxx一区二区| 麻豆一区二区在线观看| 欧美日韩国产第一页| 久久99国产精品久久久久久久久| 成人www视频在线观看| 69av视频在线播放| 国产一区视频在线| 亚洲91精品在线| 欧美日韩福利在线观看| 国产精品日日摸夜夜添夜夜av| 黑人极品videos精品欧美裸| 欧美亚洲国产成人精品| 日韩av色在线| 日韩精品久久久久久福利| 成人激情视频在线| 欧美亚州一区二区三区| 中文字幕在线精品| 91在线免费网站| 中文字幕日韩综合av| 欧美日韩国产中文精品字幕自在自线| 国产精品精品久久久| 欧洲日韩成人av| 久久免费精品日本久久中文字幕| 亚洲电影第1页| 国产视频福利一区| 国产精品免费久久久久影院| 国产一区二区三区在线视频| 日本在线精品视频| 亚洲sss综合天堂久久| 国产91精品高潮白浆喷水| 午夜精品久久久久久久男人的天堂| 欧美午夜电影在线| 国产美女精品视频免费观看| 国产成人自拍视频在线观看| 亚洲美女久久久| 国产精品久久视频| 国产亚洲xxx| 一二美女精品欧洲| 亚洲欧美综合精品久久成人| 亚洲欧美在线播放| 午夜精品久久久久久久99黑人| 精品性高朝久久久久久久| 91成人性视频| 欧美电影免费播放| 久久久av免费| 国产日韩欧美在线视频观看| 国产女同一区二区|