WWDC 2016 Session 205 What's new in CocoaTouch 总结

今天的 Session 将主要将四件事情:swift

  • 你可能已经在 App 中使用的一些核心技巧,咱们会讨论如何使用它们构建更好的 App
  • 讨论如何经过 UIKit 和其余一些 API 构建更好的用户界面
  • 展现你能够将哪些新功能集成到你的应用中
  • 应用如何经过新的系统 extension 来拓展本身

##Adaptivity 自从 Apple 推出了更大屏幕的 iPad 以后,开发者在屏幕的适配上,将会花费更多的时间。安全

Apple Pencil 、Smart Keyboard 等新的硬件,在你的 App 中使用后,也可以增长更多的亮点。网络

在以前,能够经过 Size Class 来进行屏幕的自适应,好比 iPhone 是 compact,iPad 是 regular。如今有了新的 iPad Pro,固然不会是新增一种类型,由于在 Framework 中有不少的工具来表示这种屏幕尺寸。Apple 在 SizeClass 中增长了新的特性来支持各类设备的适配。session

另外,iPad Air 2 和 Pro 可以每秒扫描屏幕 120 次,这远远大于屏幕上内容的刷新频率。开发者可使用有关 Apple Pencil 、3D Touch 等 API 来作出更棒的 App。app

Swift 3

在 Swift 3 中,不少 API 都进行了重写,所以在使用 Swift Coding 时将会有更好的体验。好比新的字体,WhiteColor 和 blackColor 简化为 white 和 black,以及与 Core Graphics 相关的一些 API,都作了简化。框架

GCD,如今是一个完整的对象,以前使用 GCD 建立自定义队列并加入 task 是这样子:async

let queue = dispatch_queue_create("com.example.queue, nil")
dispatch_async(queue) {
  // ...
}
复制代码

Swift 3 中是酱紫:函数

let queue = DispatchQueue(label: "com.example.queue")
queue.async {
  // ...
}
复制代码

这种写法简直爽的不行,特别简洁明了。工具

另外,增长了一个新的特性特别棒,在建立自定义 queue 时,可使用 autoReleasePool 将 work item 包装起来,写法很简单:布局

let q = DispatchQueue(label: "com.example.queue", attributes: [.autoreleaseWorkItem])
复制代码

有关 GCD 的其余内容能够去看单独的 GCD session。

Foundation

单位和计量制

在 Foundation 框架中,也有不少新的提高,好比 Units 和 measurements ,以及新的 DateFormatter:NSISO8601.

增长了 NSDateInterval ,这些计量和单元的内容能够观看另外一个 Session 来详细了解。

剪贴板

在 WWDC 中提到过,如今剪贴板能够跨设备使用,可是须要注意的是,若是剪贴板的内容很大时,那么在粘贴时可能会触发一个 loading 动画。

为了不产生这个动画,能够在粘贴前先作一次检查,Apple 提供了这些 API:

public class UIPasteboard : NSObject {
   public var hasStrings: Bool { get }
   public var hasURLs: Bool { get }
   public var hasImages: Bool { get }
   public var hasColors: Bool { get }
复制代码

在粘贴以前,能够先检查下粘贴板中是否有本身须要的内容,避免 loading 动画。

一样,你也能够控制向剪贴板发布哪些内容,在将内容发布到剪贴板前,能够设置过时时间,也能够限制只能用在当前设备。

Color 色域

在 iMac 5K 和 iPad Pro 9.7 上,可表示的颜色将更多。

在 iOS 和 MacOS 上,已经暴露了一些颜色的 API,可使用更加宽广的色域。

这里的提高,主要会体如今生产创造上。

Apple 并无由于 iMac 5K 和 iPad Pro 9.7 支持 pRGB 来增长新的类,只须要使用这两个 API 就行了:

public class UIColor : NSObject {
   public init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
   public init(displayP3Red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
复制代码

Image Render 图像渲染

在以前,咱们通常是建立一个 image 上下文,而后作一些自定义的绘图操做,接着获取上下文中的图像内容,而后结束这个上下文,这样子就能获取到图片了,其实这是一种常见的错误方法,由于这么作的话,图片将只有 32 bit 的 sRGB 。

这不是一个很好的 API,既没有 block ,也不能进行拓展。

以前是酱紫:

func createDrawing(size: CGSize) -> UIImage {
   let renderer = UIGraphicsBeginImageContext(size)
   // Do your drawing here
   let image = UIGraphicsGetImageFromCurrentImageContext()
   UIGraphicsEndImageContext()
   return image
}
复制代码

可是如今,Apple 新增了类 UIGraphicsRenderer,它是 block-based、full-color-managed,而且是能够拓展的,能够作位 image 和 PDF 的子类。而且管理 context 的生命周期,所以能够作一些内存优化。

下面给出正确的使用方式:

func createDrawing(size: CGSize) -> UIImage {
   let renderer = UIGraphicsImageRenderer(size: size)
   return renderer.image { rendererContext in
  } }
复制代码

Asset Management

由于我对图像色域这块不是很了解,这里大概讲的就是可使用更宽色域的图片,而且在支持显示的设备上选择高色域的显示,不支持的设备上仍然使用普通的进行显示,这与 App Thing 没有冲突,是完美结合的。

而且这种选择也是自动的,比如 @2x @3x 图片的选择。

Accessibility Inspector

Accessibility是Apple很早以前构建的一个框架,它能帮助一些行动不便的用户来更好地使用你的应用。它为你的UI提供了丰富的语义数据,这能让不一样的Accessibility功能给行动不便的用户展示你的应用。

iOS 10 在这里也提高了体验。

Speech Recognition 语音识别

语音朗读推出了更加简洁的 API,能够实时朗读,也能够自定义音频文件或者在线的音频流。

Smart Text Input

文本输入是 App 中最多见的场景,如今能够为文本输入增长一个类型信息,好比位置、电话、邮件、信用卡和数字等,这样系统就可以提供更加智能的输入建议。

在 iOS 7 中增长了动态类型,可使得文本的大小更随系统设置而改变,如今这个特性在 iOS 10 有了提高。

UITabBar 自定义

iOS 10 对于 UITabBar 的自定义给出了官方的 API,在以前,若是咱们须要一个个性的 tabBar,那么就须要作不少工做,如今简单多了:

  • 自定义的 badge 颜色和文本属性 text attributes
  • 自定义未选中状态时的 tintColor
tabBarItem.badgeColor = UIColor.white()
badgeTextAttributes = [ NSForegroundColorAttributeName : UIColor.blue(), 
NSFontAttributeName : UIFont.italicSystemFont(ofSize: 12) ] tabBarItem.setBadgeTextAttributes(textAttributes: badgeTextAttributes, 
                                    forState: UIControlStateNormal)
tabBar.unselectedTintColor = UIColor.brown()
复制代码

3D Touch 支持

WKWebView 新增了 delegate 方法,做为 3D touch 的支持。

新增类 UIPreviewInteraction ,这意味着,3D touch 的支持可使用自定义的动画。

另外还有一个小亮点就是 UIRefreshControl 支持自定义的 UIViewController 了。

CollectionView

在 iOS 9,为 collectionView 的流式布局(Flow Layout)增长了 automatic self-sizing cell,可是这须要你计算一个大概的 size。

如今为 Flow Layout 增长了新的模式,你将不在须要返回一个估算的 size。

CollectView 并还将支持分页,以前这个功能是 ScrollView 才有的。

Apple 还特别的从新设计了底层,使得 collectionView 可以更加平滑的滑动。假如你如今的 collectionView 每行有三个 cell,那么在快滑动到下一行时,将会一次性建立 3 个 cell,再假如每个 cell 都比较复杂而且耗费比较多的时间时,那么将会有卡顿。

Apple 这里提供了一个叫作 (单元格预读)cell prefetching 的技术,也就是说,你的 cell 还不须要显示在屏幕上时,可能系统会调用 data source 方法来跟你要这个 cell。

cell prefetching 技术是 iOS 10 底层实现的,因此咱们无需关注和修改,将会自动得到这项技术的支持,可能还有一些须要注意的地方就是,你须要保证你的 cellForxxx 方法,无论系统在何时调用,它都能返回正确的 cell。

Apple 不但为 cell 作了预处理,还对数据的获取也增长了预处理的 delegate 方法,这样子,咱们就可以在 cell 显示以前,作一些网络加载、硬盘数据读取等工做,大大提升了性能。而且 Data PreFetching 并非 collectionView 特有,TableView 也加入了支持。

New Animator

动画这块也加入了更新,新的动画 API 支持动画的中断、取消、反向等等,动画时间函数也增长了更多的类型。

新的动画将比如电影,你能够快进一段时间、倒退一段时间、暂停、取消、反向播放等。

用法也很简单:

// 建立动画时间函数
let timing = UICubicTimingParameters(animationCurve: .easeInOut) 
// 建立动画
let animator = UIViewPropertyAnimator(duration: duration, timingParameters: timing)
// 添加动画块
animator.addAnimations { 
	self.squareView.center = CGPoint(x: point.x, y: point.y) 
}
// 执行动画
animator.startAnimation()
复制代码

能够看到,新的 API 特别简洁明了。

经过这种新的 API,咱们能够将动画和手势控制合成在一块儿,建立出更加 excited 的视觉交互!!!

Open URL

在以前,假如咱们经过一个 url 须要跳转到微博,那么首先得经过 url 跳转到 Safari,接着若是安装了 weibo,那么就能够跳转过去,若是没有,就停留在 Safari。

咱们都是很不但愿,一个操做须要在 App 外面操做或者迫使用户离开 App。

新的 API 解决了这个问题,在跳转前能够判断系统是否安装微博,若是有就直接跳过去,没有的话就在 App 内部打开网页。

UIApplication.shared().
   open(url, options: [UIApplicationOpenURLOptionUniversalLinksOnly: true]) {
      (didOpen: Bool) in
         if !didOpen {
            // 没有安装 App,作本身的操做
} }
复制代码

CoreData

对 query generation 作了优化,简化了 CoreData 代码(再怎么简化也很难用 Orz…)。

另外一个优化的地方是链接池(Connection Pool),如今 CoreData 能够提供多个 Reader,一个 writer。这将会带来更多的性能提高。

CloudKit

支持存储公共文档:Public databases。

支持每一个人一个库(per user database),这将使得应用可以支持多用户。

数据共享:经过新的 UICloudSharingController 类进行管理。

User Activity

咱们知道,Handoff 是经过 User Activity 这个独立的信息集合单位,不依赖于其余进行传输的,iOS 10 增长了用户地理位置。

这样子,咱们就能够在 handoff 中增长更多更棒的特性了。

App Search

iOS 9 加入了应用内搜索,可是在 iOS 10 对此功能作了提高,当用户在系统的 search 中找到了查询结果后,能够点击 App 图标中的 search in app,接着进入 App 持续查找。

这个新功能能够经过很简单的方式就可以集成到 App 中。

ApplePay

Apple Pay 在 Web 和 Extensions 中也支持啦。

这意味着 SFSafariViewController 也支持了。

在 iMessage 中也能轻松集成。

widgets

widgets 如今有了两种形式,compact 和 expanded 。

能够很方便的在这两种形式上显示不一样的内容。

Notificaiton

media attachment:通知可以附加媒体信息。

end to end encryption:通知数据端到端的编码,这样子能够增长安全性。

embedded UI views:在通知中嵌入 UIView ,想一想是否是很激动,打完 Uber,而后车到了,同时在通知中给出司机的位置图片;收到快件正在配送的通知,同时显示快递员的照片。不由再吼一声 excited!

CallKit

callKit 增长了不少 VOIP 方面的特性,不过这个东西明显是动了天朝运营商的奶酪,之后的发展状况也不知道如何。

Siri

Siri 如今变的更加智能,可以根据上下文、语义等理解你的要求,这是很复杂的工做,虽然 Siri 在英语环境中确实很棒,可是到了天朝毕竟仍是有些水土不服,中文但是博大精深啊!就问 Cook 你怕不怕。

Siri 如今支持第三方的 App 拓展,SiriKit 提供了一些语义化的组件,可以让用户经过 Siri 调用你的 App。

好比你设置了「记帐」、「类型」、「多少钱」,若是用户呼叫 Siri:「我须要记帐,我刚才吃午餐花了 20 块钱」。

那么 Siri 就会命中你的设置,而后打开你的 App。

滴滴打车的 Siri 支持也是这种类型。

iMessage

iMessage 作了很大的更新,具体的能够看有关 iMessage 相关的 session。

相关文章
相关标签/搜索