今天的 Session 將主要將四件事情:
- 你可能已經(jīng)在 App 中使用的一些核心技巧,我們會討論如何使用它們構(gòu)建更好的 App
- 討論如何通過 UIKit 和其他一些 API 構(gòu)建更好的用戶界面
- 展示你可以將哪些新功能集成到你的應(yīng)用中
- 應(yīng)用如何通過新的系統(tǒng) extension 來拓展自己
Adaptivity
自從 Apple 推出了更大屏幕的 iPad 之后,開發(fā)者在屏幕的適配上,將會花費更多的時間。
Apple Pencil 、Smart Keyboard 等新的硬件,在你的 App 中使用后,也能夠增加更多的亮點。
在之前,可以通過 Size Class 來進行屏幕的自適應(yīng),比如 iPhone 是 compact,iPad 是 regular?,F(xiàn)在有了新的 iPad Pro,當(dāng)然不會是新增一種類型,因為在 Framework 中有很多的工具來表示這種屏幕尺寸。Apple 在 SizeClass 中增加了新的特性來支持各種設(shè)備的適配。
另外,iPad Air 2 和 Pro 能夠每秒掃描屏幕 120 次,這遠遠大于屏幕上內(nèi)容的刷新頻率。開發(fā)者可以使用有關(guān) Apple Pencil 、3D Touch 等 API 來做出更棒的 App。
Swift 3
在 Swift 3 中,很多 API 都進行了重寫,因此在使用 Swift Coding 時將會有更好的體驗。比如新的字體,WhiteColor 和 blackColor 簡化為 white 和 black,以及與 Core Graphics 相關(guān)的一些 API,都做了簡化。
GCD,現(xiàn)在是一個完整的對象,之前使用 GCD 創(chuàng)建自定義隊列并加入 task 是這樣子:
let queue = dispatch_queue_create("com.example.queue, nil")
dispatch_async(queue) {
// ...
}
Swift 3 中是醬紫:
let queue = DispatchQueue(label: "com.example.queue")
queue.async {
// ...
}
這種寫法簡直爽的不行,特別簡潔明了。
另外,增加了一個新的特性特別棒,在創(chuàng)建自定義 queue 時,可以使用 autoReleasePool 將 work item 包裝起來,寫法很簡單:
let q = DispatchQueue(label: "com.example.queue", attributes: [.autoreleaseWorkItem])
有關(guān) GCD 的其他內(nèi)容可以去看單獨的 GCD session。
Foundation
單位和計量制
在 Foundation 框架中,也有很多新的提升,比如 Units 和 measurements ,以及新的 DateFormatter:NSISO8601.
增加了 NSDateInterval ,這些計量和單元的內(nèi)容可以觀看另一個 Session 來詳細(xì)了解。
剪貼板
在 WWDC 中提到過,現(xiàn)在剪貼板可以跨設(shè)備使用,但是需要注意的是,如果剪貼板的內(nèi)容很大時,那么在粘貼時可能會觸發(fā)一個 loading 動畫。
為了避免產(chǎn)生這個動畫,可以在粘貼前先做一次檢查,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 }
在粘貼之前,可以先檢查下粘貼板中是否有自己需要的內(nèi)容,避免 loading 動畫。
同樣,你也可以控制向剪貼板發(fā)布哪些內(nèi)容,在將內(nèi)容發(fā)布到剪貼板前,可以設(shè)置過期時間,也可以限制只能用在當(dāng)前設(shè)備。
Color 色域
在 iMac 5K 和 iPad Pro 9.7 上,可表示的顏色將更多。
在 iOS 和 MacOS 上,已經(jīng)暴露了一些顏色的 API,可以使用更加寬廣的色域。
這里的提升,主要會體現(xiàn)在生產(chǎn)創(chuàng)造上。
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 圖像渲染
在之前,我們一般是創(chuàng)建一個 image 上下文,然后做一些自定義的繪圖操作,接著獲取上下文中的圖像內(nèi)容,然后結(jié)束這個上下文,這樣子就能獲取到圖片了,其實這是一種常見的錯誤方法,因為這么做的話,圖片將只有 32 bit 的 sRGB 。
這不是一個很好的 API,既沒有 block ,也不能進行拓展。
之前是醬紫:
func createDrawing(size: CGSize) -> UIImage {
let renderer = UIGraphicsBeginImageContext(size)
// Do your drawing here
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
但是現(xiàn)在,Apple 新增了類 UIGraphicsRenderer
,它是 block-based、full-color-managed,并且是可以拓展的,可以做位 image 和 PDF 的子類。并且管理 context 的生命周期,因此可以做一些內(nèi)存優(yōu)化。
下面給出正確的使用方式:
func createDrawing(size: CGSize) -> UIImage {
let renderer = UIGraphicsImageRenderer(size: size)
return renderer.image { rendererContext in
} }
Asset Management
因為我對圖像色域這塊不是很了解,這里大概講的就是可以使用更寬色域的圖片,并且在支持顯示的設(shè)備上選擇高色域的顯示,不支持的設(shè)備上仍然使用普通的進行顯示,這與 App Thing 沒有沖突,是完美結(jié)合的。
并且這種選擇也是自動的,好比 @2x @3x 圖片的選擇。
Accessibility Inspector
Accessibility是Apple很早之前構(gòu)建的一個框架,它能幫助一些行動不便的用戶來更好地使用你的應(yīng)用。它為你的UI提供了豐富的語義數(shù)據(jù),這能讓不同的Accessibility功能給行動不便的用戶展現(xiàn)你的應(yīng)用。
iOS 10 在這里也提升了體驗。
Speech Recognition 語音識別
語音朗讀推出了更加簡潔的 API,可以實時朗讀,也可以自定義音頻文件或者在線的音頻流。
Smart Text Input
文本輸入是 App 中最常見的場景,現(xiàn)在可以為文本輸入增加一個類型信息,比如位置、電話、郵件、信用卡和數(shù)字等,這樣系統(tǒng)就能夠提供更加智能的輸入建議。
在 iOS 7 中增加了動態(tài)類型,可以使得文本的大小更隨系統(tǒng)設(shè)置而改變,現(xiàn)在這個特性在 iOS 10 有了提升。
UITabBar 自定義
iOS 10 對于 UITabBar 的自定義給出了官方的 API,在之前,如果我們需要一個個性的 tabBar,那么就需要做很多工作,現(xiàn)在簡單多了:
- 自定義的 badge 顏色和文本屬性 text attributes
- 自定義未選中狀態(tài)時的 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。
現(xiàn)在為 Flow Layout 增加了新的模式,你將不在需要返回一個估算的 size。
CollectView 并還將支持分頁,之前這個功能是 ScrollView 才有的。
Apple 還特別的重新設(shè)計了底層,使得 collectionView 能夠更加平滑的滑動。假如你現(xiàn)在的 collectionView 每行有三個 cell,那么在快滑動到下一行時,將會一次性創(chuàng)建 3 個 cell,再假如每一個 cell 都比較復(fù)雜并且耗費比較多的時間時,那么將會有卡頓。
Apple 這里提供了一個叫做 (單元格預(yù)讀)cell prefetching 的技術(shù),也就是說,你的 cell 還不需要顯示在屏幕上時,可能系統(tǒng)會調(diào)用 data source 方法來跟你要這個 cell。
cell prefetching 技術(shù)是 iOS 10 底層實現(xiàn)的,所以我們無需關(guān)注和修改,將會自動獲得這項技術(shù)的支持,可能還有一些需要注意的地方就是,你需要保證你的 cellForxxx
方法,不管系統(tǒng)在什么時候調(diào)用,它都能返回正確的 cell。
Apple 不但為 cell 做了預(yù)處理,還對數(shù)據(jù)的獲取也增加了預(yù)處理的 delegate 方法,這樣子,我們就能夠在 cell 顯示之前,做一些網(wǎng)絡(luò)加載、硬盤數(shù)據(jù)讀取等工作,大大提高了性能。并且 Data PreFetching 并不是 collectionView 特有,TableView 也加入了支持。
New Animator
動畫這塊也加入了更新,新的動畫 API 支持動畫的中斷、取消、反向等等,動畫時間函數(shù)也增加了更多的類型。
新的動畫將好比電影,你可以快進一段時間、倒退一段時間、暫停、取消、反向播放等。
用法也很簡單:
// 創(chuàng)建動畫時間函數(shù)
let timing = UICubicTimingParameters(animationCurve: .easeInOut)
// 創(chuàng)建動畫
let animator = UIViewPropertyAnimator(duration: duration, timingParameters: timing)
// 添加動畫塊
animator.addAnimations {
self.squareView.center = CGPoint(x: point.x, y: point.y)
}
// 執(zhí)行動畫
animator.startAnimation()
可以看到,新的 API 特別簡潔明了。
通過這種新的 API,我們可以將動畫和手勢控制合成在一起,創(chuàng)建出更加 excited 的視覺交互?。?!
Open URL
在之前,假如我們通過一個 url 需要跳轉(zhuǎn)到微博,那么首先得通過 url 跳轉(zhuǎn)到 Safari,接著如果安裝了 weibo,那么就可以跳轉(zhuǎn)過去,如果沒有,就停留在 Safari。
我們都是很不希望,一個操作需要在 App 外面操作或者迫使用戶離開 App。
新的 API 解決了這個問題,在跳轉(zhuǎn)前可以判斷系統(tǒng)是否安裝微博,如果有就直接跳過去,沒有的話就在 App 內(nèi)部打開網(wǎng)頁。
UIApplication.shared().
open(url, options: [UIApplicationOpenURLOptionUniversalLinksOnly: true]) {
(didOpen: Bool) in
if !didOpen {
// 沒有安裝 App,做自己的操作
} }
CoreData
對 query generation 做了優(yōu)化,簡化了 CoreData 代碼(再怎么簡化也很難用 Orz…)。
另一個優(yōu)化的地方是連接池(Connection Pool),現(xiàn)在 CoreData 可以提供多個 Reader,一個 writer。這將會帶來更多的性能提升。
CloudKit
支持存儲公共文檔:Public databases。
支持每個人一個庫(per user database),這將使得應(yīng)用能夠支持多用戶。
數(shù)據(jù)共享:通過新的 UICloudSharingController 類進行管理。
User Activity
我們知道,Handoff 是通過 User Activity
這個獨立的信息集合單位,不依賴于其他進行傳輸?shù)模琲OS 10 增加了用戶地理位置。
這樣子,我們就可以在 handoff 中增加更多更棒的特性了。
App Search
iOS 9 加入了應(yīng)用內(nèi)搜索,但是在 iOS 10 對此功能做了提升,當(dāng)用戶在系統(tǒng)的 search 中找到了查詢結(jié)果后,可以點擊 App 圖標(biāo)中的 search in app,接著進入 App 持續(xù)查找。
這個新功能可以通過很簡單的方式就能夠集成到 App 中。
ApplePay
Apple Pay 在 Web 和 Extensions 中也支持啦。
這意味著 SFSafariViewController 也支持了。
在 iMessage 中也能輕松集成。
widgets
widgets 現(xiàn)在有了兩種形式,compact 和 expanded 。
可以很方便的在這兩種形式上顯示不同的內(nèi)容。
Notificaiton
media attachment:通知能夠附加媒體信息。
end to end encryption:通知數(shù)據(jù)端到端的編碼,這樣子可以增加安全性。
embedded UI views:在通知中嵌入 UIView ,想想是不是很激動,打完 Uber,然后車到了,同時在通知中給出司機的位置圖片;收到快件正在配送的通知,同時顯示快遞員的照片。不禁再吼一聲 excited!
CallKit
callKit 增加了很多 VOIP 方面的特性,不過這個東西明顯是動了天朝運營商的奶酪,以后的發(fā)展情況也不知道如何。
Siri
Siri 現(xiàn)在變的更加智能,能夠根據(jù)上下文、語義等理解你的要求,這是很復(fù)雜的工作,雖然 Siri 在英語環(huán)境中確實很棒,但是到了天朝畢竟還是有些水土不服,中文可是博大精深啊!就問 Cook 你怕不怕。
Siri 現(xiàn)在支持第三方的 App 拓展,SiriKit 提供了一些語義化的組件,能夠讓用戶通過 Siri 調(diào)用你的 App。
比如你設(shè)置了「記賬」、「類型」、「多少錢」,如果用戶呼叫 Siri:「我需要記賬,我剛才吃午飯花了 20 塊錢」。
那么 Siri 就會命中你的設(shè)置,然后打開你的 App。
滴滴打車的 Siri 支持也是這種類型。
iMessage
iMessage 做了很大的更新,具體的可以看有關(guān) iMessage 相關(guān)的 session。