今天的 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 來進(jìn)行屏幕的自適應(yīng)靡菇,比如 iPhone 是 compact,iPad 是 regular∶自福現(xiàn)在有了新的 iPad Pro厦凤,當(dāng)然不會是新增一種類型,因為在 Framework 中有很多的工具來表示這種屏幕尺寸育苟。Apple 在 SizeClass 中增加了新的特性來支持各種設(shè)備的適配较鼓。
另外,iPad Air 2 和 Pro 能夠每秒掃描屏幕 120 次,這遠(yuǎn)遠(yuǎn)大于屏幕上內(nèi)容的刷新頻率博烂。開發(fā)者可以使用有關(guān) Apple Pencil 香椎、3D Touch 等 API 來做出更棒的 App。
Swift 3
在 Swift 3 中禽篱,很多 API 都進(jìn)行了重寫畜伐,因此在使用 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 丐枉,也不能進(jìn)行拓展哆键。
之前是醬紫:
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è)備上仍然使用普通的進(jìn)行顯示凭涂,這與 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ù)也增加了更多的類型。
新的動畫將好比電影祸轮,你可以快進(jìn)一段時間兽埃、倒退一段時間、暫停适袜、取消柄错、反向播放等。
用法也很簡單:
// 創(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 的視覺交互K炭纭!给僵!
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 類進(jìn)行管理。
User Activity
我們知道巾表,Handoff 是通過 User Activity
這個獨立的信息集合單位汁掠,不依賴于其他進(jìn)行傳輸?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偶妖,接著進(jìn)入 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。