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中的橫屏截圖忧风。
可以看到,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)形式。
創(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的截圖如下所示,說明修改成功薪介。
結(jié)語
以上是我的一些經(jīng)驗與心得祠饺,若有不足之處,請予指正汁政。希望這篇文章對你有所幫助_道偷。