UISplitViewController
是一個容器vc, 展現一個 master-detail(主-詳(從))
界面。
主視圖改變會驅動從視圖的改變。兩個視圖可用同時展現,也能夠只顯示一個。當建立app界面的時候,UISplitViewController
一般是root vc
,它沒有本身的元素可展現,它展現的是它的子vc
,可經過屬viewControllers
來設置。數組
preferredDisplayMode: UISplitViewControllerDisplayMode -分隔視圖的指望展現方式
經過此屬性來設置splitViewController
的展現方式。splitViewController
會盡力以你設置的方式展現,若是沒有足夠的空間,會用一個不一樣類型的界面展現。改變此屬性,splitViewController
將動態的改變如今的展現模式。
支持四中展現模式:app
enum UISplitViewControllerDisplayMode : Int { //自適應模式,splitViewController會爲可用空間選用合適的展現視圖方式,在ipad的豎直方向會用.PrimaryOverlay模式展現視圖,在iPad水平方向將會用.AllVisible 模式展現。 case Automatic //主視圖隱藏 case PrimaryHidden //主詳視圖都顯示 case AllVisible //主視圖部分覆蓋詳細視圖 case PrimaryOverlay }
若是想顯示的更改分隔視圖的顯示模式,那麼在界面中應該包含這個按鈕。點擊此按鈕,經過deletage
的方法 targetDisplayModeForActionInSplitViewController:
最後返回的值來改變分隔視圖的顯示模式。iphone
func targetDisplayModeForActionInSplitViewController(svc: UISplitViewController) -> UISplitViewControllerDisplayMode { return UISplitViewControllerDisplayMode.Automatic }
presentsWithGesture: Bool - 指定一個隱藏的視圖控制器是否可使用一個滑動手勢來呈現和退出。ide
此屬性針對iphone6s plus
橫屏及ipad
有效,便是針對 size class
爲(w:Regular)
或則(height:Regular)
的狀況。當它的屬性爲true的時候,splitViewController 會添加一個手勢識別器,經過delegete
的方法targetDisplayModeForActionInSplitViewController
返回的顯示模式,來改變splitViewController
的當前顯示模式。若是設置爲false則手勢無效。ui
self.presentsWithGesture = true self.delegate = self //代理方法,手勢滑動改變顯示模式 func targetDisplayModeForActionInSplitViewController(svc: UISplitViewController) -> UISplitViewControllerDisplayMode { //返回此模式,主從視圖同時顯示,滑動手勢無效。 return UISplitViewControllerDisplayMode.AllVisible //主視圖隱藏,隱藏以後iPad沒法再顯示,iphone6s plus轉到橫屏,不受此屬性約束,能夠再顯 示。 return UISplitViewControllerDisplayMode.PrimaryHidden //主視圖覆蓋從視圖 return UISplitViewControllerDisplayMode.PrimaryOverlay //根據設備尺寸和類型自適應 return UISplitViewControllerDisplayMode.Automatic }
禁用手勢的狀況以下: spa
viewControllers: [ UIViewController ] - 管理的視圖控制器代理
當分隔視圖界面展開的時候,此屬性包括兩個vc,當它摺疊的時候,此屬性包含一個vc。 數組中第一個元素稱爲 primary(或 master)
vc, 若是第二個元素呈現,那麼它稱爲secondary(或 detail)
vc。
能夠用此屬性初始化splitViewController,但當splitViewController已經顯示的時候,最好用 showDetailViewController:sender:
或者showViewController:sender:
來設置子vc。code
override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) //從 storyboard初始化一個vc let vc = storyboard?.instantiateViewControllerWithIdentifier("detailVC") as! DetailViewController vc.selectedIndex = 400 self.showDetailViewController(vc, sender: self ) }
– showDetailViewController:sender: - 顯示詳細視圖
此方法會調用delegate
的方法 splitViewController:showDetailViewController:sender:
,給delegate
一個顯示vc的機會。若是delegate
不想顯示,那麼 splitViewController
會向前發送消息到將要被替換的vc,看看這個vc有什麼要作的。例如:導航控制器會把vc放入它的導航棧中。若是沒有任何對象想顯示vc,那麼splitViewController
按照以下方法安排vc的顯示:對象
detail vc
展現。modally
方式展現。delegate: UISplitViewControllerDelegate? - 代理blog
協議定義了一個方法可讓你管理一個拆分視圖界面的變化。使用此協議的方法來響應當前顯示模式和當前界面方向的變化。當拆分視圖界面摺疊和展開時,或當一個新的視圖控制器被添加到界面時,您還可使用這些方法來適當地配置子視圖控制器。
主要方法以下:
//當視圖轉換到摺疊模式,一般只顯示主視圖,經過此方法能夠定製主視圖。 fun primaryViewControllerForCollapsingSplitViewController(splitViewController: UISplitViewController) -> UIViewController? { return nil } //視圖轉換爲摺疊模式,可用實現此方法爲主視圖進行一些處理,或者嘗試把詳細視圖的內容包含進新的摺疊視圖。此方法會回後,splitViewController會把詳細視圖vc從 ‘viewControllers’ 屬性中移除。 返回false表示splitViewController採用默認的方式嘗試在摺疊視圖中包含 ‘detail vc’,同時也會調用 master vc 的方法‘collapseSecondaryViewController:forSplitViewController:’對 ‘detail vc’對內容作一些處理,大部分控制器什麼也不作,但當是‘UINavigationController’對時候會把 ‘detail vc’放入到導航堆棧中。 返回true,表示什麼也不作。 func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool { return true } //當從水平緊湊變爲水平正常模式時,調用此方法返回主控制器用來顯示,可用返回特定的vc,若是返回nil將使用當前的主控制器。 func primaryViewControllerForExpandingSplitViewController(splitViewController: UISplitViewController) -> UIViewController? { return nil } //爲拆分視圖返回詳細視圖控制器,若是返回爲nil,splitViewController將會調用主控制的方法: separateSecondaryViewControllerForSplitViewController:來返回一個合適的vc,大部分控制器默認什麼也不作,但當是UINavigationController的時候會返回導航棧頂端的元素。 func splitViewController(splitViewController: UISplitViewController, separateSecondaryViewControllerFromPrimaryViewController primaryViewController: UIViewController) -> UIViewController? { return nil }