今天的 Session 将主要将四件事情:swift
##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 中,不少 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 框架中,也有不少新的提高,好比 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 动画。
一样,你也能够控制向剪贴板发布哪些内容,在将内容发布到剪贴板前,能够设置过时时间,也能够限制只能用在当前设备。
在 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 上下文,而后作一些自定义的绘图操做,接着获取上下文中的图像内容,而后结束这个上下文,这样子就能获取到图片了,其实这是一种常见的错误方法,由于这么作的话,图片将只有 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
} }
复制代码
由于我对图像色域这块不是很了解,这里大概讲的就是可使用更宽色域的图片,而且在支持显示的设备上选择高色域的显示,不支持的设备上仍然使用普通的进行显示,这与 App Thing 没有冲突,是完美结合的。
而且这种选择也是自动的,比如 @2x @3x 图片的选择。
Accessibility是Apple很早以前构建的一个框架,它能帮助一些行动不便的用户来更好地使用你的应用。它为你的UI提供了丰富的语义数据,这能让不一样的Accessibility功能给行动不便的用户展示你的应用。
iOS 10 在这里也提高了体验。
语音朗读推出了更加简洁的 API,能够实时朗读,也能够自定义音频文件或者在线的音频流。
文本输入是 App 中最多见的场景,如今能够为文本输入增长一个类型信息,好比位置、电话、邮件、信用卡和数字等,这样系统就可以提供更加智能的输入建议。
在 iOS 7 中增长了动态类型,可使得文本的大小更随系统设置而改变,如今这个特性在 iOS 10 有了提高。
iOS 10 对于 UITabBar 的自定义给出了官方的 API,在以前,若是咱们须要一个个性的 tabBar,那么就须要作不少工做,如今简单多了:
tabBarItem.badgeColor = UIColor.white()
badgeTextAttributes = [ NSForegroundColorAttributeName : UIColor.blue(),
NSFontAttributeName : UIFont.italicSystemFont(ofSize: 12) ] tabBarItem.setBadgeTextAttributes(textAttributes: badgeTextAttributes,
forState: UIControlStateNormal)
tabBar.unselectedTintColor = UIColor.brown()
复制代码
WKWebView 新增了 delegate 方法,做为 3D touch 的支持。
新增类 UIPreviewInteraction
,这意味着,3D touch 的支持可使用自定义的动画。
另外还有一个小亮点就是 UIRefreshControl 支持自定义的 UIViewController 了。
在 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 也加入了支持。
动画这块也加入了更新,新的动画 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 的视觉交互!!!
在以前,假如咱们经过一个 url 须要跳转到微博,那么首先得经过 url 跳转到 Safari,接着若是安装了 weibo,那么就能够跳转过去,若是没有,就停留在 Safari。
咱们都是很不但愿,一个操做须要在 App 外面操做或者迫使用户离开 App。
新的 API 解决了这个问题,在跳转前能够判断系统是否安装微博,若是有就直接跳过去,没有的话就在 App 内部打开网页。
UIApplication.shared().
open(url, options: [UIApplicationOpenURLOptionUniversalLinksOnly: true]) {
(didOpen: Bool) in
if !didOpen {
// 没有安装 App,作本身的操做
} }
复制代码
对 query generation 作了优化,简化了 CoreData 代码(再怎么简化也很难用 Orz…)。
另外一个优化的地方是链接池(Connection Pool),如今 CoreData 能够提供多个 Reader,一个 writer。这将会带来更多的性能提高。
支持存储公共文档:Public databases。
支持每一个人一个库(per user database),这将使得应用可以支持多用户。
数据共享:经过新的 UICloudSharingController 类进行管理。
咱们知道,Handoff 是经过 User Activity
这个独立的信息集合单位,不依赖于其余进行传输的,iOS 10 增长了用户地理位置。
这样子,咱们就能够在 handoff 中增长更多更棒的特性了。
iOS 9 加入了应用内搜索,可是在 iOS 10 对此功能作了提高,当用户在系统的 search 中找到了查询结果后,能够点击 App 图标中的 search in app,接着进入 App 持续查找。
这个新功能能够经过很简单的方式就可以集成到 App 中。
Apple Pay 在 Web 和 Extensions 中也支持啦。
这意味着 SFSafariViewController 也支持了。
在 iMessage 中也能轻松集成。
widgets 如今有了两种形式,compact 和 expanded 。
能够很方便的在这两种形式上显示不一样的内容。
media attachment:通知可以附加媒体信息。
end to end encryption:通知数据端到端的编码,这样子能够增长安全性。
embedded UI views:在通知中嵌入 UIView ,想一想是否是很激动,打完 Uber,而后车到了,同时在通知中给出司机的位置图片;收到快件正在配送的通知,同时显示快递员的照片。不由再吼一声 excited!
callKit 增长了不少 VOIP 方面的特性,不过这个东西明显是动了天朝运营商的奶酪,之后的发展状况也不知道如何。
Siri 如今变的更加智能,可以根据上下文、语义等理解你的要求,这是很复杂的工做,虽然 Siri 在英语环境中确实很棒,可是到了天朝毕竟仍是有些水土不服,中文但是博大精深啊!就问 Cook 你怕不怕。
Siri 如今支持第三方的 App 拓展,SiriKit 提供了一些语义化的组件,可以让用户经过 Siri 调用你的 App。
好比你设置了「记帐」、「类型」、「多少钱」,若是用户呼叫 Siri:「我须要记帐,我刚才吃午餐花了 20 块钱」。
那么 Siri 就会命中你的设置,而后打开你的 App。
滴滴打车的 Siri 支持也是这种类型。
iMessage 作了很大的更新,具体的能够看有关 iMessage 相关的 session。