WWDC 201 What's new in cocoa touch

880 阅读4分钟

这是每年必看的一个 session,基本上是 iOS 的 API 更新的总章,会告诉你都有哪几个点的 feature。今年也不例外,苹果的着眼点是:

  • Productivity
  • UI refinements
  • API enhancement

Productivity

Drag and drop

这是今年的重头戏,非常强大。你可以在 照片 app 中选择多张图,然后拖入 email.app,他就成了 email 的附件。

苹果为了开发者能做好这方面的开发,准备了四讲 Session

这里苹果也没展开具体说 API 怎么用,只是列了一下让一个 customView 支持 drag 和 drop 分别要实现什么。

  • Drop

  • Drag

我这里也就不展开去写 demo 了,等后面四个 session 一起来玩一下这个 API。

File ManageMent

由于 iOS 11 苹果给了一个新的 app —— files。

苹果很大方的把 files 的 view controller 拿出来给大伙儿用。

这个东西看起来不起眼,然而他具有高度的可定制性;可以访问本地文件或者云盘文件.

具体详细介绍,见:

UI Refinements

NavigationBar

iOS 11 在 UIKit 上最明显的变化就是 WinPhone 样子的 NavigationBar 了。

NavigationBar 的 title 支持了大字模式。

再滚上去之后,就又会变成我们熟悉的 title

而开启大字模式,仅需这两个 API

可以看最上面那张效果图里的 Message 的 navigaitonbar,它内置了搜索框。我们通过这样的代码也可以启用它:

然后,苹果居然把 RefreshControl 也坐进去了。。。

苹果据说这个 feature 你若是用了 大字模式 + UIRefreshControl。这个是自动实现的。

于是乎坑爹的地方开始了:

这个东西是 NavigationBar......高度变了,变厚了好多。于是我们当初若谁图省事用 44 来拿高度的,全都会挂出去。

苹果给了一个新的 API,来标记这块可变区域

SafeAreaInsets,也不知道谁想出来的名字。

对应的代码是这样的:

然后苹果自豪的说,UIScrollview 能帮你自动完成很多适配问题。你甚至不需要写一行代码。

当然不能 100% 保证,如果你想自己 handle。你可以通过修改这些 API:

长成这模样的 API 大家应该很熟悉吧。当初 iOS 7 开始变成全屏模式之后,也有个类似的东西。用不好就会 app 上面顶出来 64px 的空白区域。

所以我个人觉得,不要对这个 api 抱有太大希望。

以及事实上确实如此,我成功用 xcode 9 把礼物说跑起来了,兼容性问题出现最大的地方就是 navigationbar 的行为问题。

TableView

TableView 的修改,可以参考 Mail App,多加了一些 Cell 的侧滑手势:

实现起来蛮容易的,且 UIKit 自动帮你完成很多事情:

API enhancement

Swift4 And Foundation

  • Codable protocol

这个东西还是蛮强大的,你只需要在 enum/struct/class 上实现 codable 这个协议,默认的 protocol extension 就能帮你完成 NSCoding/JSON/Plist 的序列化与反序列化。

但事实上吧...并没有那么智能,他有点像 Android 的 Gson 库。仅支持 key 和 property 一一对应。如果不对应的话,还是要手动实现的。

不过怎么说还是比原来用 SwiftyJSON 实现起来优雅多了。

  • KeyPath

苹果越发的让代码变得更安全,在 OC 的历史包袱上,我们知道 selector、valueForKeyPath 之类的东西全都是用字符串来描述的。

这类东西没有补全,写起来很容易出问题。Swift 3 攻克了 Selector 的问题,Swift 4 让 KeyPath 也变得安全了。

  • block-based KVO

既然 KeyPath 被翻新了,苹果就顺路把 KVO 也收拾了

代码比以前简洁太多了。

UIKit

  • preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge

UIViewController 的一个 method,用来 defer 系统的各种手势,例如上边缘下滑唤出 notificationCenter,提升用户体验。

  • AutoLayout and ScrollView

ScrollView 添加了两个 layoutGuide:ContentLayoutGuide 和 frameLayoutGuide 来帮助我们解决 ScrollView 上加 Autolayout 的问题,真是激动人心,然而我们国内开发者没法用

  • dynamic type

在过去,如果我们想支持大字模式的话。我们需要用 UIFont 的 preferredFont Api,然而国内开发者们很少用。因为我们设计师用的兰亭细黑之类的,特殊字体。

新的 API 就愉快多了:

甚至可以这样:

于是 Autolayout 也添加了相关的功能,毕竟布局是整体的,当字号跟着变大了,行距之类的都要进行调整。

这个 feature 同样适用于 VFL 和 UIStackView

Password autofill

强行借鉴 1Password

Asset Catalogs

  • 可以用命名 color 了,比如直接 themeColor,而不用更像之前那样需要自己写 Enum
  • PDF 的图片可以根据 dynamicType 进行缩放
  • Tabbar 在大字模式下 会有按住显示 tabbar 内容的 feature。如果你用了 PDF 的图片,体验会好很多。

ProMotion 刷新率

因为 iPad Pro 120FPS,所以 UIScreen 提供了获取设备最大的刷新率的 API。我们可以根据自己的 app,动态调整刷新率。