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。

相關文章
相關標籤/搜索