UISplitViewController - iPad分屏視圖控制器


UISplitViewController - 分屏視圖控制器

概述

UISplitViewController 是一個容器vc, 展示一個 master-detail(主-詳(從))界面。 
主視圖改變會驅動從視圖的改變。兩個視圖可用同時展示,也可以只顯示一個。當創建app界面的時候,UISplitViewController通常是root vc ,它沒有自己的元素可展示,它展示的是它的子vc,可通過屬viewControllers來設置。

主要屬性及方法

preferredDisplayMode: UISplitViewControllerDisplayMode -分隔視圖的期望展示方式 
通過此屬性來設置splitViewController的展示方式。splitViewController會盡力以你設置的方式展示,如果沒有足夠的空間,會用一個不同類型的界面展示。改變此屬性,splitViewController將動態的改變現在的展示模式。 
支持四中展示模式:

enum UISplitViewControllerDisplayMode : Int {
    //自適應模式,splitViewController會為可用空間選用合適的展示視圖方式,在ipad的豎直方向會用.PrimaryOverlay模式展示視圖,在iPad水平方向將會用.AllVisible 模式展示。
    case Automatic
    //主視圖隱藏
    case PrimaryHidden
    //主詳視圖都顯示
    case AllVisible
    //主視圖部分覆蓋詳細視圖
    case PrimaryOverlay
}

 

  • diplayModeButtonItem: UIBarButtonItem - 改變分隔視圖顯示模式的按鈕

如果想顯示的更改分隔視圖的顯示模式,那么在界面中應該包含這個按鈕。點擊此按鈕,通過deletage的方法 
targetDisplayModeForActionInSplitViewController:最后返回的值來改變分隔視圖的顯示模式。

 func targetDisplayModeForActionInSplitViewController(svc: UISplitViewController)    -> UISplitViewControllerDisplayMode {
        return UISplitViewControllerDisplayMode.Automatic
    }

 

 

presentsWithGesture: Bool - 指定一個隱藏的視圖控制器是否可以使用一個滑動手勢來呈現和退出。

此屬性針對iphone6s plus橫屏及ipad有效,即是針對 size class 為(w:Regular)或則(height:Regular)的情況。當它的屬性為true的時候,splitViewController 會添加一個手勢識別器,通過delegete的方法targetDisplayModeForActionInSplitViewController返回的顯示模式,來改變splitViewController的當前顯示模式。如果設置為false則手勢無效。

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
    }

 

 

  • 這里寫圖片描述 

禁用手勢的情況如下: 
這里寫圖片描述

viewControllers: [ UIViewController ] - 管理的視圖控制器

當分隔視圖界面展開的時候,此屬性包括兩個vc,當它折疊的時候,此屬性包含一個vc。 數組中第一個元素稱為 
primary(或 master)vc, 如果第二個元素呈現,那么它稱為secondary(或 detail)vc。 
可以用此屬性初始化splitViewController,但當splitViewController已經顯示的時候,最好用 showDetailViewController:sender:或者showViewController:sender:來設置子vc。

 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的顯示:

  • 在水平正常環境(w:Regular), vc作為detail vc展示。
  • 在水平緊湊環境(w:Compact),vc以modally方式展示。

delegate: UISplitViewControllerDelegate? - 代理

協議定義了一個方法可以讓你管理一個拆分視圖界面的變化。使用此協議的方法來響應當前顯示模式和當前界面方向的變化。當拆分視圖界面折疊和展開時,或當一個新的視圖控制器被添加到界面時,您還可以使用這些方法來適當地配置子視圖控制器。

主要方法如下:

//當視圖轉換到折疊模式,通常只顯示主視圖,通過此方法可以定制主視圖。    
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

    }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM