[译] 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前端后端产品设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划

相关文章
相关标签/搜索