UISplitViewController 是一個容器vc, 展示一個 master-detail(主-詳(從))界面。
主視圖改變會驅(qū)動從視圖的改變。兩個視圖可用同時展示,也可以只顯示一個。當創(chuàng)建app界面的時候,UISplitViewController通常是root vc ,它沒有自己的元素可展示,它展示的是它的子vc,可通過屬viewControllers來設(shè)置。
1. 主要屬性及方法
(1)分隔視圖的期望展示方式
@available(iOS 8.0, *)
public enum UISplitViewControllerDisplayMode : Int {
// 自適應(yīng)模式,splitViewController會為可用空間選用合適的展示視圖方式,在ipad的豎直方向會用. primaryOverlay模式展示視圖,在iPad水平方向?qū)? allVisible 模式展示。
case automatic
// 主視圖隱藏
case primaryHidden
// 主詳視圖都顯示
case allVisible
// 主視圖部分覆蓋詳細視圖
case primaryOverlay
}
...
open var preferredDisplayMode: UISplitViewControllerDisplayMode
typedef NS_ENUM(NSInteger, UISplitViewControllerDisplayMode) {
UISplitViewControllerDisplayModeAutomatic,
UISplitViewControllerDisplayModePrimaryHidden,
UISplitViewControllerDisplayModeAllVisible,
UISplitViewControllerDisplayModePrimaryOverlay,
} NS_ENUM_AVAILABLE_IOS(8_0);
...
@property (nonatomic) UISplitViewControllerDisplayMode preferredDisplayMode NS_AVAILABLE_IOS(8_0);
(2)diplayModeButtonItem: UIBarButtonItem - 改變分隔視圖顯示模式的按鈕
如果想顯示的更改分隔視圖的顯示模式,那么在界面中應(yīng)該包含這個按鈕。點擊此按鈕,通過deletage的方法
optional public func targetDisplayModeForAction(in svc: UISplitViewController) -> UISplitViewControllerDisplayMode
最后返回的值來改變分隔視圖的顯示模式。
(3)presentsWithGesture: Bool - 指定一個隱藏的視圖控制器是否可以使用一個滑動手勢來呈現(xiàn)和退出。
此屬性針對iphone6s plus橫屏及ipad有效,即是針對 size class 為(w:Regular)或則(height:Regular)的情況。當它的屬性為true的時候,splitViewController 會添加一個手勢識別器,通過delegete的方法optional public func targetDisplayModeForAction(in svc: UISplitViewController) -> UISplitViewControllerDisplayMode
返回的顯示模式,來改變splitViewController的當前顯示模式。如果設(shè)置為false則手勢無效。
使用手勢:
禁用手勢:
(4)viewControllers: [ UIViewController ] - 管理的視圖控制器
當分隔視圖界面展開的時候,此屬性包括兩個vc,當它折疊的時候,此屬性包含一個vc。 數(shù)組中第一個元素稱為
primary(或 master)vc, 如果第二個元素呈現(xiàn),那么它稱為secondary(或 detail)vc。
可以用此屬性初始化splitViewController,但當splitViewController已經(jīng)顯示的時候,最好用 open func show(_ vc: UIViewController, sender: Any?)
或者open func showDetailViewController(_ vc: UIViewController, sender: Any?)
來設(shè)置子vc。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// 從 storyboard初始化一個vc
let vc = storyboard?.instantiateViewController(withIdentifier: "detailVC") as! DetailViewController
self.showDetailViewController(vc, sender: self )
}
(5)showDetailViewController - 顯示詳細視圖
此方法會調(diào)用delegate的方法optional public func splitViewController(_ splitViewController: UISplitViewController, showDetail vc: UIViewController, sender: Any?) -> Bool
,給delegate一個顯示vc的機會。如果delegate不想顯示,那么 splitViewController會向前發(fā)送消息到將要被替換的vc,看看這個vc有什么要做的。例如:導航控制器會把vc放入它的導航棧中。如果沒有任何對象想顯示vc,那么splitViewController按照如下方法安排vc的顯示:
- 在水平正常環(huán)境(w:Regular), vc作為detail vc展示。
- 在水平緊湊環(huán)境(w:Compact),vc以modally方式展示。
(6)delegate: UISplitViewControllerDelegate? - 代理
協(xié)議定義了一個方法可以讓你管理一個拆分視圖界面的變化。使用此協(xié)議的方法來響應(yīng)當前顯示模式和當前界面方向的變化。當拆分視圖界面折疊和展開時,或當一個新的視圖控制器被添加到界面時,您還可以使用這些方法來適當?shù)嘏渲米右晥D控制器。
主要方法如下:
// 當視圖轉(zhuǎn)換到折疊模式,通常只顯示主視圖,通過此方法可以定制主視圖。
optional public func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController?
// 視圖轉(zhuǎn)換為折疊模式,可用實現(xiàn)此方法為主視圖進行一些處理,或者嘗試把詳細視圖的內(nèi)容包含進新的折疊視圖。
// 此方法會回后,splitViewController會把詳細視圖vc從 ‘viewControllers’ 屬性中移除。 返回false表示splitViewController采用默認的方式嘗試在折疊視圖中包含 ‘detail vc’,同時也會調(diào)用
// master vc 的方法‘collapseSecondaryViewController:forSplitViewController:’對 ‘detail vc’對內(nèi)容做一些處理,大部分控制器什么也不做,但當是‘UINavigationController’對時候會把
‘detail vc’放入到導航堆棧中。 返回true,表示什么也不做。
optional public func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool
// 當從水平緊湊變?yōu)樗秸DJ綍r,調(diào)用此方法返回主控制器用來顯示,可用返回特定的vc,如果返回nil將使用當前的主控制器。
optional public func primaryViewController(forExpanding splitViewController: UISplitViewController) -> UIViewController?
//為拆分視圖返回詳細視圖控制器,如果返回為nil,splitViewController將會調(diào)用主控制的方法:
separateSecondaryViewControllerForSplitViewController:來返回一個合適的vc,
// 大部分控制器默認什么也不做,但當是UINavigationController的時候會返回導航棧頂端的元素。
optional public func splitViewController(_ splitViewController: UISplitViewController, separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController?