[譯] iOS 11:UIKit 中值得注意的新能力

iOS 11:UIKit 中值得注意的新能力

本週每一個 iOS 開發者都在熱切地觀看 W.W.D.C. 的宣講視頻 😜javascript

蘋果的經常使用框架又有了新玩法前端

在蘋果的粉絲羣體中被稱爲 #HairForceOne 的 Craig Federighi ,在 48 小時前揭開了 iOS 11 的新面目。毫無疑問咱們又有了新的 API 能夠研究。相比受到了重點照顧的 iPad ,蘋果今年沒有給 iPhone 過多的介紹。java

趁着尚未忘記,我總結了幾條吸引個人新變化,順序與重要性無關。react

UIStackView

你們都喜好的 UIStackView 只獲得了一點點改變,但關鍵是這正是它所須要的。我曾經寫過這樣一篇文章 stack view 的結構越複雜就越靈活 ,可是在它的強大和神奇的自動佈局以外,有一點它作的不夠好:改變它子視圖之間的間距。android

在 iOS 11 中這一點獲得了改善。事實上 PSPDFKit 的 Pete Steinberger 問你們 UIKit 的改善中什麼使咱們印象最深入,個人第一想法是:ios

這個改善能夠經過一個新的方法簡單地實現:git

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 時無數次遇到上面這種場景,很是彆扭。在舊版本的 UIStackView 的實現中,你只能將全部的間距設置爲一致的值,或者添加一個 「spacer」 視圖( API 剛出現時就有的一個很是古老的屬性)來添加間距。 github

若是你的 U.I. 須要以動畫的形式增長或減小子視圖之間的間距,稍後能夠去查詢和設置相關參數:後端

let currentPadding = horizontalStackView.customSpacing(after: view3)複製代碼

UITableView

在開發者社區中一直有一個爭論:table view 是否應該被一個 collection view 的 UITableViewFlowLayout 或者相似的東西取代。在 iOS 11 中,蘋果重申了這兩種組件是明確獨立的兩種組件,開發者應該根據場景選擇使用哪一種組件。app

首先,table view 默認你須要自動計算行高,設置了以下屬性:

tv.estimatedRowHeight = UITableViewAutomaticDimension複製代碼

這種作法譭譽參半,在解決一些使人頭疼的問題的同時,它自己也帶來了一些問題(丟幀,內容邊距計算問題,滾動條各類亂跳,等等)。

這裏注意了,若是你不想遭遇這種行爲 —— 你確實有理由不想遭遇它,你能夠像這樣倒退回 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 如今能夠進行批量更新了:

let tv = UITableView()

tv.performBatchUpdates({ () -> Void in
    tv.insertRows/deleteRows/insertSections/removeSections
}, completion:nil)複製代碼

UIPasteConfiguration

這一部分在 「 What’s New in Cocoa Touch 」 的宣講中直接激起了個人興趣。爲了粘貼操做支持拖拽數據的傳遞,如今每一個 UIResponder 都有一個粘貼配置的屬性:

self.view.pasteConfiguration = UIPasteConfiguration()複製代碼

這個類主要接受粘貼和拖拽的數據,它能夠經過傳入特定的標識符來限定只接受你想要的數據:

//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)複製代碼

如今咱們可以輕易的處理拖拽或者粘貼的數據,不管是來自什麼系統或者哪一個用戶,由於在 iOS 11 中全部的 UIResponders 都遵照 UIPasteConfigurationSupporting 協議:

override func paste(itemProviders: [NSItemProvider])
{
    //Act on pasted data
}複製代碼

總結

很高興能寫一些關於 iOS 11 的東西。雖然老是有不少新東西等着探索和發現,但正因如此,我想咱們能夠從軟件開發中獲得一些知足感,畢竟咱們中的許多人由於工做或者興趣的緣由天天都要和這些框架打交道。

W.W.D.C. 還在繼續進行,大量的代碼向咱們洶涌而來,咱們又有不少新的框架須要掌握,也有不少樣例代碼須要閱讀。這是個使人興奮的時刻。不管是新的臃腫的導航條,仍是 UIFontMetrics ,或者是拖拽式的 API ,都有大量的新內容等着咱們去探索。

來不及說了,快上車 📱


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃

相關文章
相關標籤/搜索