WWDC 2016 Session 205 - What's new in CocoaTouch 總結(jié)

今天的 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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容