iOS 9 多任務(wù)分屏要點(diǎn)

本文涉及的 Session 有

Getting Started with Multitasking on iPad in iOS 9

Multitasking Essentials for Media-Based Apps on iPad in iOS 9

Optimizing Your App for Multitasking on iPad in iOS 9

iOS 9 多任務(wù)綜述

iOS 9 中最引人注目的新特性就是多任務(wù)了,在很久以前的越獄開發(fā)里就已經(jīng)出現(xiàn)過類似的插件楣导,而像是 Windows Surface 系列上也已經(jīng)有分屏多任務(wù)的特性,可以讓用戶同時使用兩個或多個 app。iOS 9 中也新加入類似的特性莹痢。iOS 9 中的多任務(wù)有三種表現(xiàn)形式映胁,臨時出現(xiàn)和交互的滑動覆蓋 (Slide Over)峭弟,真正的分屏同時操作兩個 app 的分割視圖 (Split View),以及在其他 app 里依然可以進(jìn)行視頻播放的畫中畫 (Picture in Picture) 模式弦撩。

在關(guān)于多任務(wù)的文檔中,Apple 明確指出:

絕大部分 app 都應(yīng)當(dāng)適配 Slide Over 和 Split View

因為這正是 iOS 9 的核心功能之一论皆,也是你的用戶所期望看到的益楼。另一方面,支持多任務(wù)也增加了你的用戶打開和使用你的 app 的可能点晴。不過多任務(wù)有一點(diǎn)限制感凤,那就是在能夠安裝 iOS 9 的 iPad 設(shè)備上,僅只有性能最強(qiáng)大的 iPad Air 2 和之后的機(jī)型支持分割視圖模式觉鼻,而其他像是 iPad mini 2俊扭,iPad mini 3 以及 iPad Air 只支持滑動覆蓋和畫中畫兩種模式。這在一定程度上應(yīng)該還是基于移動設(shè)備資源和性能限制的考慮做出的決策坠陈,畢竟要保證良好的使用體驗為前提萨惑,多任務(wù)才會有意義。

對于開發(fā)者來說仇矾,雖然多種布局看起來很復(fù)雜庸蔼,但是實際上如果緊跟 Apple 的技術(shù)步伐的話,將自己的 iPad app 進(jìn)行多任務(wù)適配并不會是一件非常困難的事情贮匕。因為滑動覆蓋模式和分割視圖模式所采用的布局其實就是 Compact Width 的布局姐仅,而這一概念就是 WWDC14 上引入的基于屏幕特征的 UI 布局方式。如果你已經(jīng)在使用這套布局方式了的話,那么可以說多任務(wù)視圖的支持也就順帶自動完成了掏膏。

Adaptive UI 復(fù)習(xí)

Adaptive UI 是 Apple 在 iOS 8 提出的概念劳翰。在此之前,我們?nèi)绻胍瑫r為 iPhone 和 iPad 開發(fā) app 的話馒疹,很可能會寫很多設(shè)備判斷的代碼佳簸,比如這樣:

ifUI_USER_INTERFACE_IDIOM()== .Pad {// 設(shè)備是 iPad}

除此之外,如果我們想要同時適配橫向和縱向的話颖变,我們會需要類似這樣的代碼:

ifUIInterfaceOrientationIsPortrait(orientation) {// 屏幕是豎屏}

這些判斷和分支不僅難寫難讀生均,也使適配開發(fā)困難重重。從 iOS 8 之后腥刹,開發(fā)者不應(yīng)該再依賴這樣設(shè)備向來進(jìn)行 UI 適配马胧,而應(yīng)該轉(zhuǎn)而使用新的 Size Class 體系。Apple 將自家的移動設(shè)備按照尺寸區(qū)別衔峰,將縱橫兩個方向設(shè)計了 Regular 和 Compact 的組合佩脊。比如 iPhone 在豎屏?xí)r寬度是 Compact,高度是 Regular朽色,橫屏?xí)r iPhone 6 Plus 寬度是 Regular邻吞,高度是 Compact,而其他 iPhone 在橫屏?xí)r高度和寬度都是 Compact葫男;iPad 不論型號和方向抱冷,寬度及高度都是 Regular。現(xiàn)有的設(shè)備的 Size Class 如下圖所示:

針對 Size Class 進(jìn)行開發(fā)的思想下梢褐,我們不再關(guān)心具體設(shè)備的型號或者尺寸旺遮,而是根據(jù)特定的 Size Class 的特性來展示內(nèi)容。在 Regular 的寬度下盈咳,我們可以在水平方向上展示更多的內(nèi)容耿眉,比如同時顯示 Master 和 Detail View Controller 等。同樣地鱼响,我們也不應(yīng)該再關(guān)心設(shè)備旋轉(zhuǎn)的問題鸣剪,而是轉(zhuǎn)而關(guān)心 Size Class 的變化。在開發(fā)時丈积,如果是使用 Interface Builder 的話筐骇,在制作 UI 時就注意為不同的 Size Class 配置合適的約束和布局,在大多數(shù)情況下就已經(jīng)足夠了江滨。如果使用代碼的話铛纬,UITraitCollection類將是使用和操作 Size Class 的關(guān)鍵。我們可以根據(jù)當(dāng)前工作的UIViewController的traitCollection屬性來設(shè)置合適的布局唬滑,并且在-willTransitionToTraitCollection:withTransitionCoordinator:和-viewWillTransitionToSize:withTransitionCoordinator:被調(diào)用時對 UI 布局做出正確的響應(yīng)告唆。

雖然并不是理論上不可行棺弊,但是使用純手寫來操作 Size Class 會是一件異常痛苦的事情,我們還是應(yīng)該盡可能地使用 IB 來減少這部分的工作量擒悬,加快開發(fā)效率模她。

iPad 中的多任務(wù)適配

對于 iOS 9 中的多任務(wù),滑動覆蓋和分割視圖的初始位置茄螃,新打開的 app 的尺寸都將是設(shè)備尺寸的 1/3缝驳。不過這個比例并不重要,我們需要記住的是新打開的 app 將運(yùn)行在 Compact Width 和 Regular Height 的 Size Class 下归苍。也就是說,如果你的 iPad app 使用了 Size Class 進(jìn)行布局运怖,并且是支持 iPhone 豎屏的拼弃,那么恭喜,你只需要換到 iOS 9 SDK 并且重新編譯你的 app摇展,就搞定了吻氧。

因為本文的重點(diǎn)不是教你怎么開發(fā)一個 Adaptive UI 的 app,所以并不打算在這方面深入下去咏连。如果你在去年缺了課盯孙,不是很了解這方面的話,這篇教程可能可以幫你快速了解并掌握這些內(nèi)容祟滴。如果你想要直接上手看看 iOS 9 中的 多任務(wù)是如何工作的話振惰,可以新建一個 Master-Detail Application,并將其安裝到 iPad 模擬器上垄懂。Master-Detail 的模板工程為我們搭設(shè)了一個很好的適配 Size Class 的框架骑晶,讓項目可以在任何設(shè)備上都表現(xiàn)良好。同樣你也可以觀察它在 iOS 9 的 iPad 上的表現(xiàn)草慧。

但是其實并不是所有的 app 都應(yīng)該適配多任務(wù)桶蛔,比如一個需要全屏才能體驗的游戲就是典型。如果你不想你的 app 可以作為多任務(wù)的副 app 被使用的話漫谷,你可以在 Info.plist 中添加UIRequiresFullScreen并將其設(shè)為true仔雷。

Easy enough?沒錯舔示,要適配 iPad 的多任務(wù)碟婆,你需要做的就只有按照標(biāo)準(zhǔn)流程開發(fā)一個全平臺通用 app,僅此而已斩郎。

使用 iOS 9 SDK 構(gòu)建你的 app脑融;

支持所有的方向和對應(yīng)的 Size Class;

使用 launch storyboard 作為 app 啟動頁面缩宜。

雖說沒太多特別值得一提的內(nèi)容肘迎,但是也還是有一些需要注意的小細(xì)節(jié)甥温。

一些值得注意的小細(xì)節(jié)

在以前是不存在 app 在前臺還要和別的 app 共享屏幕這種事情的,所以UIScreen.bounds和主窗口的UIWindow.bounds使用上來說基本是同義詞妓布。但是在多任務(wù)時代姻蚓,UIWindow就有可能只有 1/3 或者 1/2 屏幕大小了。如果你在之前的 app 中有使用它來定義你的視圖的話匣沼,就有必要為多任務(wù)做特殊的處理了狰挡。不過雖然滑動覆蓋和分割視圖都是在右側(cè)展示,但是它們的 Window 的 origin 依然是 (0, 0)释涛,這也方便了我們定義視圖加叁。

第二個細(xì)節(jié)是現(xiàn)在 iPad UI 的 Size Class 是會發(fā)生變化的。以前不論是豎直還是水平唇撬,iPad 屏幕的 Size 總是長寬均為 Regular 的它匕。但是在 iOS 9 中情況就不一樣了,你的 app 可能被作為附加 app 通過多任務(wù)模式打開窖认,可能會在多任務(wù)時被用戶拖動從而變成全屏 app (這時 Size Class 將從 Compact 的寬度變?yōu)?Regular)豫柬,甚至可能你的 app 作為主 app 被使用是會因為用戶拖動而變成 Compact 寬度的 app:

換句話說,你不知道你的 app 的 Size Class 會不會變化扑浸,以及何時變化烧给,這都是用戶操作的結(jié)果。因此在開發(fā)時喝噪,就必須充分考慮到這一點(diǎn)础嫡,力求在尺寸變化時呈現(xiàn)給用戶良好的效果。根據(jù)屏幕大小進(jìn)行合適的 UI 設(shè)計和調(diào)整自不用說仙逻,另外還應(yīng)當(dāng)注意在合適的時機(jī)利用transitionCoordinator的-animateAlongsideTransition:來進(jìn)行布局動畫驰吓,讓切換更加自然。

由于多任務(wù)帶來了多個 app 同臺運(yùn)行的可能性系奉,因此你的 app 必定會面臨和別的 app 一起運(yùn)行的情況檬贰。在開發(fā)移動應(yīng)用時永遠(yuǎn)不能忘記的是設(shè)備平臺的限制。相比于桌面設(shè)備缺亮,移動端只有有限的內(nèi)存翁涤,而兩個甚至三個 app 同時在前臺運(yùn)行,就需要我們精心設(shè)計內(nèi)存的使用萌踱。對于一般開發(fā)者來說葵礼,合理地分配內(nèi)存,監(jiān)聽 Memory Warning 來釋放 cache 和不必要的 view controller并鸵,避免循環(huán)引用等等鸳粉,應(yīng)該成為熟練掌握的日常開發(fā)基本功。

最后一個細(xì)節(jié)是對完美的苛求了园担。在 iOS 9 中多任務(wù)也通過 App Switcher 來進(jìn)行 app 之間的切換的届谈。所以在你的 app 被切換到后臺時枯夜,系統(tǒng)會保存你的 app 的當(dāng)前狀態(tài)的截圖,以供之后切換時顯示艰山。你的 app 現(xiàn)在有可能被作為 Regular 的全屏 app 使用湖雹,也可能使用 Compact 布局,所以在截圖時系統(tǒng)也會依次保存兩份截圖曙搬。用戶可能會在全屏模式下把你的 app 關(guān)閉摔吏,然后通過多任務(wù)再將你的 app 作為附加 app 打開,這時最好能保證 App Switcher 中的截圖和 app 打開后用戶看到的截圖一致纵装,以獲取最好的體驗征讲。可能這并不是一個很大的問題搂擦,但是如果追求極致的用戶體驗的話稳诚,這也是必行的。對于那些含有用戶敏感數(shù)據(jù)瀑踢,需要將截圖模糊處理的 app,現(xiàn)在也需要注意同時將兩種布局的截圖都進(jìn)行處理才避。

畫中畫模式

iOS 9 中多任務(wù)的另一種表現(xiàn)形式就是視頻的畫中畫模式:即使退出了橱夭,你的視頻 app 也可以在用戶使用別的 app 的時候保持播放,比如一邊看美劇一邊寫日記或者發(fā)郵件桑逝。這大概會是所有的視頻類 app 都必須要支持的特性了棘劣,實現(xiàn)起來也很容易:

使用 iOS 9 SDK 構(gòu)建你的 app;

在 app 的 Capabilities 里楞遏,將 Background Modes 的 "Audio, AirPlay, and Picture in Picture" 勾選上 (Xcode 7 beta 中暫時為 "Audio and AirPlay")茬暇;

將 AudioSession Catogory設(shè)置為合適的選項,比如AVAudioSessionCategoryPlayback

使用 AVKit寡喝,AVFoundation 或者 WebKit 框架來播放視頻糙俗。

在 iOS 9 中,一直伴隨我們的 MediaPlayer 框架中的視頻播放部分正式宣布壽終正寢预鬓。也就是說巧骚,如果你在使用MPMoviePlayerViewController或者M(jìn)PMoviePlayerController在播放視頻的話,你就無法使用畫中畫的特性了格二,因此盡快轉(zhuǎn)型到新的視頻播放框架會是急迫的適配任務(wù)劈彪。因為畫中畫模式是基于AVPlayerLayer的。當(dāng)切換到畫中畫時顶猜,會將正在播放視頻的 layer 取出沧奴,然后進(jìn)行縮小后添加到新的界面的 layer 上。這也是舊的 MediaPlayer 框架無法支持畫中畫的主要原因长窄。

如果你使用AVPlayerViewController的話滔吠,一旦滿足這些簡單的條件以后纲菌,你應(yīng)該就可以在使用相應(yīng)框架全屏播放視頻時看到右下角的畫中畫按鈕了。不論是點(diǎn)擊這個按鈕進(jìn)入畫中畫模式還是直接使用 Home 鍵切換到后臺屠凶,已經(jīng)在播放的視頻就將縮小到屏幕右下角成為畫中畫驰后,并保持播放。在畫中畫模式下矗愧,系統(tǒng)會在視頻的 AVPlayerLayer 上添加一套默認(rèn)控件灶芝,用來控制暫停/繼續(xù),關(guān)閉唉韭,以及返回 app夜涕。前兩個控制沒什么可多說的,返回 app 的話需要我們自己處理返回后的操作属愤。一般來說我們希望能夠恢復(fù)到全屏模式并且繼續(xù)播放這個視頻崖堤,因為AVPlayerViewController進(jìn)行播放時我們一般不會去操作AVPlayerLayer,在恢復(fù)時就需要實現(xiàn)AVPlayerViewControllerDelegate中的-playerViewController:restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:來根據(jù)傳入的 ViewController 重建 UI癣漆,并將true通過 CompletionHandler 返回給系統(tǒng)箱亿,已告知系統(tǒng)恢復(fù)成功 (當(dāng)然如果無法恢復(fù)的話需要傳遞 false)。

我們也可以直接用AVPlayerLayer來構(gòu)建的自定義的播放器贱呐。這時我們需要通過傳入所使用的AVPlayerLayer來創(chuàng)建一個AVPictureInPictureController丧诺。AVPictureInPictureController提供了檢查是否支持畫中畫模式的 API,以及其他一些控制畫中畫行為的方法奄薇。與直接使用AVPlayerViewController不太一樣的是驳阎,在恢復(fù)時,系統(tǒng)將會把畫中畫時縮小的AVPlayerLayer返還到之前的 view 上馁蒂。我們可以通過AVPictureInPictureControllerDelegate中的相應(yīng)方法來獲知畫中畫的執(zhí)行情況呵晚,并結(jié)合自己 app 的情況來恢復(fù) UI。

總結(jié)

通過之前幾年的布局沫屡,在 AutoLayout 和 Size Class 的基礎(chǔ)上饵隙,Apple 在 iOS 9 中放出了多任務(wù)這一殺手锏∷ⅲ可以說同屏執(zhí)行多個 app 的需求從初代 iPad 開始就一直存在癞季,而現(xiàn)在總算是姍姍來遲。在 OS X 10.11 中倘潜,Apple 也將類似的特性引入了 OSX app 的全屏模式中绷柒,可以說是統(tǒng)一 OSX 和 iOS 這兩個平臺的進(jìn)一步嘗試。

但是 iPad 上的多任務(wù)還是有一些不足的涮因。最大的問題是 app 依然是運(yùn)行在沙盒中的废睦,這就意味著在 iOS 上我們還是無法在兩個 app 之間進(jìn)行通訊:比如同時打開照片和一個筆記 app,我們無法通過拖拽方式將某張圖片直接拖到筆記中去养泡。雖然在 iOS 中也有XPC 服務(wù)嗜湃,但是第三方開發(fā)者現(xiàn)在并不能使用奈应,這在一定程度上還是限制了多任務(wù)的可能性。

不過總體來說购披,多任務(wù)特性使得 iPad 的實用性大大上升杖挣,這也肯定會是未來用戶最常用以及最希望在 app 中看到的特性之一「斩福花一點(diǎn)時間惩妇,學(xué)習(xí) Adaptive UI 的制作方式,讓 app 支持多任務(wù)運(yùn)行筐乳,會是一件很合算的事情歌殃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蝙云,隨后出現(xiàn)的幾起案子氓皱,更是在濱河造成了極大的恐慌,老刑警劉巖勃刨,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件波材,死亡現(xiàn)場離奇詭異,居然都是意外死亡身隐,警方通過查閱死者的電腦和手機(jī)各聘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抡医,“玉大人,你說我怎么就攤上這事早敬〖缮担” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵搞监,是天一觀的道長水孩。 經(jīng)常有香客問我,道長琐驴,這世上最難降的妖魔是什么俘种? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮绝淡,結(jié)果婚禮上宙刘,老公的妹妹穿的比我還像新娘。我一直安慰自己牢酵,他們只是感情好悬包,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馍乙,像睡著了一般布近。 火紅的嫁衣襯著肌膚如雪垫释。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天撑瞧,我揣著相機(jī)與錄音棵譬,去河邊找鬼。 笑死预伺,一個胖子當(dāng)著我的面吹牛订咸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扭屁,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼算谈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了料滥?” 一聲冷哼從身側(cè)響起然眼,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葵腹,沒想到半個月后高每,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡践宴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年鲸匿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阻肩。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡带欢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烤惊,到底是詐尸還是另有隱情乔煞,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布柒室,位于F島的核電站渡贾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雄右。R本人自食惡果不足惜空骚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望擂仍。 院中可真熱鬧囤屹,春花似錦、人聲如沸防楷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冲簿,卻和暖如春粟判,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峦剔。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工档礁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吝沫。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓呻澜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惨险。 傳聞我的和親對象是個殘疾皇子羹幸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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