淺析Split View Controller的collapse特性

Xcode自帶的Master-Detail模板應(yīng)用,在iPad和iPhone上有著不同的展示方式脑又。今天來淺要介紹下如何在橫屏?xí)r文留,使得SplitView在iPhone中的表現(xiàn)與在iPad中的保持一致题禀。


iPad和iPhone中的不同

準(zhǔn)備工作

打開Xcode,使用iOS->Application->Master-Detail Application模板創(chuàng)建一個App穴店,取名隨意撕捍。

運行后界面比較

以下分別是初始化的App在iPad、iPhone 6 Plus泣洞、iPhone 6中的橫屏截圖忧风。

iPad橫屏截圖
iPhone 6 Plus橫屏截圖
iPhone 6 橫屏截圖

可以看到,App在iPad和Plus中的橫屏表現(xiàn)幾乎一致球凰,除了Plus中沒有顯示最上面的狀態(tài)欄和新增了Detail View左上角的按鈕狮腿。但在其它iPhone中時,都只顯示Master View呕诉,不同時顯示Master和Detail View缘厢。這是由于什么原理造成的呢?


原理探究

Size Classes

想到iPhone 6 Plus甩挫、iPhone 6的屏幕尺寸不同贴硫,對應(yīng)的Size Class也不盡相同,故找來各個iOS設(shè)備的Size Class做對比伊者,如下表所示:

設(shè)備與方向
Compact Compact 除了Plus以外的所有橫屏iPhone
Compact Regular 所有的豎屏iPhone
Regular Compact 橫屏的Plus
Regular Regular iPad英遭,不管橫豎屏

可以看到,在橫屏狀態(tài)删壮,iPad的寬和高都是Regular贪绘,Plus的寬是Regular,高是Compact央碟,其余iPhone的寬和高都是Compact。故有可能只有在設(shè)備寬是Regular時均函,SplitView才會默認(rèn)同時顯示Master和Detail View亿虽。因此只要在iOS設(shè)備的interface environment發(fā)生改變時,檢測設(shè)備的長和寬苞也,若都為Compact洛勉,則將寬設(shè)為Regular,即可改變SplitView的默認(rèn)collapse做法如迟。

traitCollectionDidChange

當(dāng)interface environment發(fā)生改變時收毫,traitCollectionDidChange方法會被調(diào)用攻走,可以在這里進行相關(guān)設(shè)置。

首先在Storyboard中拖入一個Navigation Controller此再,將其設(shè)為Initial View Controller昔搂,并將原先為Initial View Controller的Split View Controller設(shè)為它的root view controller。這樣做是為了用新加的Navigation Controller來控制Split View Controller的traitCollection change行為输拇。同時將Navigation Controller的Shows Navigation Bar選項取消勾選摘符,使其不影響原有視圖表現(xiàn)形式。

取消勾選Shows Navigation Bar

創(chuàng)建基于UINavigationController的RootViewController類策吠,將其與新添加的Navigation Controller相對應(yīng)逛裤。在該類中實現(xiàn)traitCollectionDidChange方法:

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    let splitViewController = self.viewControllers[0]
    
    if self.traitCollection.verticalSizeClass == .Compact && self.traitCollection.horizontalSizeClass == .Compact {
        let trait = UITraitCollection(horizontalSizeClass: .Regular)
        self.setOverrideTraitCollection(trait, forChildViewController: splitViewController)
    } else {
        self.setOverrideTraitCollection(nil, forChildViewController: splitViewController)
    }
}

以上代碼的作用是,當(dāng)檢測到設(shè)備的長和寬都為Compact時猴抹,則這時候是在除了Plus以外的橫屏iPhone中運行App带族,將其寬設(shè)為Regular,SplitView能夠同時顯示Master和Detail View蟀给;否則蝙砌,不做任何重載。

AppDelegate微調(diào)

同時需要在AppDelegate.swift的didFinishLaunchingWithOptions函數(shù)進行微調(diào)坤溃,如下所示:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let rootViewController = self.window!.rootViewController as! RootViewController
    let splitViewController = rootViewController.viewControllers[0] as! UISplitViewController
    
//        let splitViewController = self.window!.rootViewController as! UISplitViewController

    let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
    navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
    splitViewController.delegate = self
    return true
}

運行結(jié)果

在iPhone 6下重新運行App拍霜,橫屏?xí)r的截圖如下所示,說明修改成功薪介。

iPhone6橫屏截圖

結(jié)語

以上是我的一些經(jīng)驗與心得祠饺,若有不足之處,請予指正汁政。希望這篇文章對你有所幫助_道偷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市记劈,隨后出現(xiàn)的幾起案子勺鸦,更是在濱河造成了極大的恐慌,老刑警劉巖目木,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件换途,死亡現(xiàn)場離奇詭異,居然都是意外死亡刽射,警方通過查閱死者的電腦和手機军拟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誓禁,“玉大人懈息,你說我怎么就攤上這事∧∏。” “怎么了辫继?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵怒见,是天一觀的道長。 經(jīng)常有香客問我姑宽,道長遣耍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任低千,我火速辦了婚禮配阵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘示血。我一直安慰自己棋傍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布难审。 她就那樣靜靜地躺著瘫拣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪告喊。 梳的紋絲不亂的頭發(fā)上麸拄,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音黔姜,去河邊找鬼拢切。 笑死,一個胖子當(dāng)著我的面吹牛秆吵,可吹牛的內(nèi)容都是我干的淮椰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纳寂,長吁一口氣:“原來是場噩夢啊……” “哼主穗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毙芜,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤忽媒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腋粥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晦雨,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年隘冲,在試婚紗的時候發(fā)現(xiàn)自己被綠了金赦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡对嚼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绳慎,到底是詐尸還是另有隱情纵竖,我是刑警寧澤漠烧,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站靡砌,受9級特大地震影響已脓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜通殃,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一度液、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧画舌,春花似錦堕担、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朋腋,卻和暖如春齐疙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旭咽。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工贞奋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穷绵。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓轿塔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親请垛。 傳聞我的和親對象是個殘疾皇子催训,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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