- 原文地址:iOS 11: Notable UIKit Additions
- 原文作者:本文已獲原作者 Jordan Morgan 授權
- 譯文出自:掘金翻譯計劃
- 譯者:zhangqippp
- 校對者:Danny1451,atuooo
iOS 11:UIKit 中值得注意的新能力
本周每個 iOS 開發(fā)者都在熱切地觀看 W.W.D.C. 的宣講視頻 ??
蘋果的常用框架又有了新玩法
在蘋果的粉絲群體中被稱為 #HairForceOne 的 Craig Federighi ,在 48 小時前揭開了 iOS 11 的新面目。毫無疑問我們又有了新的 API 可以研究。相比受到了重點照顧的 iPad ,蘋果今年沒有給 iPhone 過多的介紹。
趁著還沒有忘記,我總結了幾條吸引我的新變化,順序與重要性無關。
UIStackView
大家都喜愛的 UIStackView 只得到了一點點改變,但關鍵是這正是它所需要的。我曾經(jīng)寫過這樣一篇文章 stack view 的結構越復雜就越靈活 ,但是在它的強大和神奇的自動布局之外,有一點它做的不夠好:改變它子視圖之間的間距。
在 iOS 11 中這一點得到了改善。事實上 PSPDFKit 的 Pete Steinberger 問大家 UIKit 的改善中什么使我們印象最深刻,我的第一想法是:

這個改善可以通過一個新的方法簡單地實現(xiàn):
let view1 = UIView()
let view2 = UIView()
let view3 = UIView()
let view4 = UIView()
let horizontalStackView = UIStackView(arrangedSubviews: [view1, view2, view3, view4])
horizontalStackView.spacing = 10
// Put another 10 points of spacing after view3
horizontalStackView.setCustomSpacing(10, after: view3)
我自己在使用 stack view 時無數(shù)次遇到上面這種場景,非常別扭。在舊版本的 UIStackView 的實現(xiàn)中,你只能將所有的間距設置為一致的值,或者添加一個 “spacer” 視圖( API 剛出現(xiàn)時就有的一個非常古老的屬性)來添加間距。
如果你的 U.I. 需要以動畫的形式增加或減少子視圖之間的間距,稍后可以去查詢和設置相關參數(shù):
let currentPadding = horizontalStackView.customSpacing(after: view3)
UITableView
在開發(fā)者社區(qū)中一直有一個爭論:table view 是否應該被一個 collection view 的 UITableViewFlowLayout 或者類似的東西取代。在 iOS 11 中,蘋果重申了這兩種組件是明確獨立的兩種組件,開發(fā)者應該根據(jù)場景選擇使用哪種組件。
首先,table view 默認你需要自動計算行高,設置了如下屬性:
tv.estimatedRowHeight = UITableViewAutomaticDimension
這種做法毀譽參半,在解決一些令人頭疼的問題的同時,它本身也帶來了一些問題(丟幀,內(nèi)容邊距計算問題,滾動條各種亂跳,等等)。
這里注意了,如果你不想遭遇這種行為 —— 你確實有理由不想遭遇它,你可以像這樣倒退回 iOS 10:
tv.estimatedRowHeight = 0
我們可以以新的方式來給用戶在 cell 上左右輕劃的動作添加自定義行為,我們還能精確地得到用戶是從首部還是尾部輕劃。這些跟上下文相關的動作是已存在的 UITableViewRowAction 的加強版,UITableViewRowAction 是在 iOS 8 中添加的:
let itemNameRow = 0
func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
{
if indexPath.row == itemNameRow
{
let editAction = UIContextualAction(style: .normal, title: "Edit", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
//do edit
//The handler resets the context to its normal state, true shows a visual indication of completion
success(true)
})
editAction.image = UIImage(named: "edit")
editAction.backgroundColor = .purple
let copyAction = UIContextualAction(style: .normal, title: "Copy", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
//do copy
success(true)
})
return UISwipeActionsConfiguration(actions: [editAction, copyAction])
}
return nil
}
這個代理方法的使用和尾部輕劃的使用是一致的。另一個好處是我們可以設置一個默認的輕劃動作,用于響應用戶向左或向右的長輕劃動作,如同原生郵箱中刪除郵件時所做的那樣:
let contextualGroup = UISwipeActionsConfiguration(actions: [editAction, copyAction])
contextualGroup.performsFirstActionWithFullSwipe = true
return contextualGroup
這個屬性的默認值是 true ,所以你得記得在不需要響應該動作時關掉它,盡管看起來大部分情況都應該響應。
為了不被超過太多,table view 從它的小兄弟(譯者注:collection view )那里學了一招,table view 現(xiàn)在可以進行批量更新了:
let tv = UITableView()
tv.performBatchUpdates({ () -> Void in
tv.insertRows/deleteRows/insertSections/removeSections
}, completion:nil)
UIPasteConfiguration
這一部分在 “ What’s New in Cocoa Touch ” 的宣講中直接激起了我的興趣。為了粘貼操作和支持拖拽數(shù)據(jù)的傳遞,現(xiàn)在每個 UIResponder 都有一個粘貼配置的屬性:
self.view.pasteConfiguration = UIPasteConfiguration()
這個類主要接受粘貼和拖拽的數(shù)據(jù),它可以通過傳入特定的標識符來限定只接受你想要的數(shù)據(jù):
//Means this class already knows what UTIs it wants
UIPasteConfiguration(forAccepting: UIImage.self)
//Or we can specify it at a more granular level
UIPasteConfiguration(acceptableTypeIdentifiers:["public.video"])
而且這些標識符是可變的,所以如果你的應用需要的話,你可以實時地改變它們:
let pasteConfig = UIPasteConfiguration(acceptableTypeIdentifiers: ["public.video"])
//Bring on more data
pasteConfig.addAcceptableTypeIdentifiers(["public.image, public.item"])
//Or add an instance who already adopts NSItemProviderReading
pasteConfig.addTypeIdentifiers(forAccepting: NSURL.self)
現(xiàn)在我們能夠輕易的處理拖拽或者粘貼的數(shù)據(jù),不論是來自什么系統(tǒng)或者哪個用戶,因為在 iOS 11 中所有的 UIResponders 都遵守 UIPasteConfigurationSupporting 協(xié)議:
override func paste(itemProviders: [NSItemProvider])
{
//Act on pasted data
}
總結
很高興能寫一些關于 iOS 11 的東西。雖然總是有很多新東西等著探索和發(fā)現(xiàn),但正因如此,我想我們可以從軟件開發(fā)中得到一些滿足感,畢竟我們中的許多人因為工作或者興趣的原因每天都要和這些框架打交道。
W.W.D.C. 還在繼續(xù)進行,大量的代碼向我們洶涌而來,我們又有很多新的框架需要掌握,也有很多樣例代碼需要閱讀。這是個令人興奮的時刻。不論是新的臃腫的導航條,還是 UIFontMetrics ,或者是拖拽式的 API ,都有大量的新內(nèi)容等著我們?nèi)ヌ剿鳌?/p>
來不及說了,快上車 ??
掘金翻譯計劃 是一個翻譯優(yōu)質(zhì)互聯(lián)網(wǎng)技術文章的社區(qū),文章來源為 掘金 上的英文分享文章。內(nèi)容覆蓋 Android、iOS、React、前端、后端、產(chǎn)品、設計 等領域,想要查看更多優(yōu)質(zhì)譯文請持續(xù)關注 掘金翻譯計劃。
