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 來進(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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末购撼,一起剝皮案震驚了整個濱河市跪削,隨后出現(xiàn)的幾起案子谴仙,更是在濱河造成了極大的恐慌,老刑警劉巖碾盐,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狞甚,死亡現(xiàn)場離奇詭異,居然都是意外死亡廓旬,警方通過查閱死者的電腦和手機哼审,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孕豹,“玉大人涩盾,你說我怎么就攤上這事±常” “怎么了春霍?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叶眉。 經(jīng)常有香客問我址儒,道長,這世上最難降的妖魔是什么衅疙? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任莲趣,我火速辦了婚禮,結(jié)果婚禮上饱溢,老公的妹妹穿的比我還像新娘喧伞。我一直安慰自己,他們只是感情好绩郎,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布潘鲫。 她就那樣靜靜地躺著,像睡著了一般肋杖。 火紅的嫁衣襯著肌膚如雪溉仑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天状植,我揣著相機與錄音浊竟,去河邊找鬼。 笑死浅萧,一個胖子當(dāng)著我的面吹牛逐沙,可吹牛的內(nèi)容都是我干的哲思。 我是一名探鬼主播洼畅,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棚赔!你這毒婦竟也來了帝簇?” 一聲冷哼從身側(cè)響起徘郭,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丧肴,沒想到半個月后残揉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡芋浮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年抱环,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纸巷。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡镇草,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘤旨,到底是詐尸還是另有隱情梯啤,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布存哲,位于F島的核電站因宇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祟偷。R本人自食惡果不足惜察滑,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望修肠。 院中可真熱鬧杭棵,春花似錦、人聲如沸氛赐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艰管。三九已至滓侍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牲芋,已是汗流浹背撩笆。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缸浦,地道東北人夕冲。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像裂逐,于是被迫代替她去往敵國和親歹鱼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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