UISplit​View​Controller 学习记录

UISplitViewController类是一个容器视图控制器,它显示一个master-detail界面(主界面、详细界面)。在master-detail界面中,主视图控制器(master)的变化会驱动辅助视图控制器(detail)变化。 两个视图控制器(master控制器、detail控制器)的排列是可以控制的, 他们可以同时显示或者一次只显示一个。UISplitViewController在iOS3.2的时候就有了,只不过iOS8才开始支持iPhone(比如在iPhone6 plus上显示视图和iPad很相似了)。

Overview

在构建应用程序的用户界面时,split​View​Controller通常是应用程序窗口(window)的根视图控制器。split​View​Controller没有明显的外观,它的外观基本上是由它的子视图控制器(master、detail控制器)决定的。 你可以以Interface Builder的方式或者代码的方式构建该控制器。

Note
你不能把split​View​Controllerpush到navigationController的栈中
尽管在一些容器视图控制器中,把split​View​Controller当做子控制器这个操作是可行的,但是大多数情况不允许这么做。再次声明,split​View​Controller通常配置为window的root控制器。 有关实现界面的方法的提示和指导,请参阅iOS Human Interface Guidelines

split​View​Controller基于可用空间确定其子视图控制器的排列:

在水平规则的环境中,split​View​Controller尽可能并排地呈现其视图控制器(同时并排地显示master、detail控制器)。

在水平紧凑的环境中,split​View​Controller的行为更像导航控制器,最初显示主视图控制器,并根据需要pushpop第二个控制器。

当显示在屏幕上时,split​View​Controller使用其"代理对象"(Delegation object)来管理其子视图控制器的显示。具体参考此处:UISplit​View​Controller​Delegate

Configuring the Appearance of the Split View Interface

split​View​Controller显示的视图配置由当前显示模式(displayMode)决定。 配置displayMode需要用到preferredDisplayMode属性。

20170405341751.png

分割视图控制器尽力尊重您指定的显示模式,但由于空间限制,可能无法视觉上适应该模式。 例如,分割视图控制器不能在水平紧凑的环境中并排显示其子视图控制器。

下面列出了可用的显示模式,并描述了视图控制器如何布置在屏幕上。 该表还列出了用于请求指定显示模式的常量。

20170405758942.png
  • Side-by-side

    同时显示全部控制器。主视图控制器显示在左侧,通常比次视图控制器更窄。可以使用preferred​Primary​Column​Width​Fraction属性来控制宽度.
    is​Collapsed属性为true的时候,这个模式不会显示。在折叠的界面(collapsed interface)时,一次只能看到一个试图控制器。
    这个模式由枚举中all​Visible表示。

  • Hidden:

    次视图控制器显示在屏幕上,主视图控制器处于关闭屏幕。
    要显示主视图控制器,您必须以模态显示(present it modally)或更改显示模式(change the display mode)。
    该模式由枚举中的primary​Hidden表示。

  • Overlay

    次视图控制器在屏幕上,主视图控制器分层在其上。 在此模式下,主视图控制器部分地遮挡了次视图控制器(如下图:右侧的控制器一部分被遮挡了)。
    此模式由primary​Overlay表示。

当设置完preferredDisplayMode后,split​View​Controller会自动更新,并在displayMode属性中反映实际的显示模式。

您可以随时更改首选显示模式,这样做会导致split​View​Controller相应地进行自我调整 。

分割视图控制器还安装内置手势识别器,让用户使用滑动来更改显示模式。您可以通过将presentsWithGesture属性设置为false来抑制此手势识别器。

2017040669931.png

display​Mode​Button​Item

display​Mode​Button​Item方法返回一个特殊的barButtonItem,用于改变displayMode,你可以将其包含在应用程序的用户界面中。

2017040666102.png

你需要做的是将这个barButtonItem添加到界面中相应的navigation bartoolbar

当它点击被的时候,按钮会向splitViewController发送一个消息,告诉它改变当前的displayMode

关于改变的结果取决于代理方法中的target​Display​Mode​For​Action(in:​)方法(ps: Objctve-C中对应targetDisplayModeForActionInSplitViewController:)。次方法缺省值的为Automatic

//设置举例
 // Called by the gesture AND barButtonItem to determine what they will set the display mode to (and what the displayModeButtonItem's appearance will be.) Return UISplitViewControllerDisplayModeAutomatic to get the default behavior.
- (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc {
    
    if (self.displayMode == UISplitViewControllerDisplayModePrimaryHidden) {
        
        return UISplitViewControllerDisplayModeAllVisible;
    }else if (self.displayMode == UISplitViewControllerDisplayModeAllVisible){
        
        return UISplitViewControllerDisplayModePrimaryHidden;
    }else{ //UISplitViewControllerDisplayModePrimaryOverlay
        
        return UISplitViewControllerDisplayModePrimaryHidden;
    }
    //这个是缺省值。 默认: 展开为`Overlay`. 隐藏为`Hidden`
    //return UISplitViewControllerDisplayModeAutomatic;
}

上述代理如果设置返回的是UISplitViewControllerDisplayModeAutomatic或者干脆没实现这个代理方法,视图控制器会根据当前屏幕大小选择合适的模式。 例如,在竖屏的iPad上,控制器在hidden和overlay模式之间切换。

切换模式也可以通过手势来进行,手势也可以通过代理方法来确定要使用的显示模式。

Changing Child View Controllers in a Split View Interface(改变子视图控制器)

当设计一个splitViewController的时候,当然如果主视图和辅助视图都不改变是最好的。

常见的技术是在主视图和辅助视图都是导航控制器(navigationController)控制的,然后可以根据实际的需要进行控制器的push或者pop操作.

如果需要更改主视图控制器或辅助视图控制器,建议您使用show(_:​sender:​)show​Detail​View​Controller(_:​sender:​) 方法。使用这些方法(而不是直接修改controllers属性)使分割视图控制器以最适合当前显示模式和size class的方式呈现指定的视图控制器。

splitViewController知道如何以更直观的方式调整界面。它甚至可以与其他容器视图控制器(如导航控制器)一起使用来呈现视图控制器。举个有点特殊的例子,在比较紧凑(compact)的环境中(比如iPhone 6plus的横屏状态),开始显示的控制器A(辅助视图)是一个导航控制器。这时候调用show​Detail​View​Controller(_:​sender:​)方法并不会替换掉视图控制器A。相反,视图控制器A将目标控制器push到其导航堆栈。

Collapsing and Expanding the Split View Interface

splitViewController进行展开和收齐的时候,它的size class在水平方向的regularcompact间切换。 在切换过程中,splitViewController会改变子视图控制器的显示方式.

当从水平方向regular转换到compact时,splitViewController”收起“后显示一个控制器。
当从水平方向compact转换到regular时,splitViewController会根据设定的displayMode屏幕”展开“显示一个或多个控制器.

收起 (collapsing process)

当界面转换到“收起"时,分割视图控制器与其代理一起管理转换。在”收起“结束时,splitViewController通常只显示主视图控制器了。

你可以在代理中实现primary​View​Controller(for​Collapsing:​)方法来变此行为。您可以使用该方法来指定次视图控制器或完全不同的视图控制器 - 也许那个控制器更适合在水平方向compact的环境中显示。

如果相对控制器和视图层次进行额外调整,你可以在代理中实现split​View​Controller(_:​collapse​Secondary:​onto:​)方法。

展开 (expansion process)

展开是收起的相反的过程。这一过程会询问delegate哪个控制器将成为主视图控制器(primary view controller)并且提供给delegate机会去执行transition变换。

如果你实现了"收起"的代理方法,那么同样你也应该为"展开"实现primary​View​Controller(for​Expanding:​)split​View​Controller(_:​separate​Secondary​From:​)方法。

如果没实现“收起”和“展开”的任何代理方法,那也没关系。splitViewController提供了收起/展开的缺省值。


关于收起(collapse)、展开(expand)的更多信息,请查看UISplit​View​Controller​Delegate.

Message Forwarding to Its Child View Controllers

splitViewController对window和子控制器(child view controllers)进行了协调。 因此所有到子控制的所有消息都会流经splitViewController.
这通常可以预期,消息的流程应该比较直观。 例如,仅当相应的子视图控制器实际出现在屏幕上时才会发送查看外观显示或消失的消息。

State Preservation

在iOS6或者更高版本上,如果你给定了splitViewController的restoration​Identifier属性值。 那么它将会保存具有有效恢复标识符(valid restoration identifier)的所有子控制器。

在程序下一次启动时,splitViewController将会回复到之前的状态。splitViewController的子视图控制器可以使用相同的恢复标识符。splitViewController自动存储附加信息,以确保每个子控制器的恢复路径是唯一的。

有关状态保存和恢复的工作原理的更多信息,请参阅App Programming Guide for iOS

参考内容
https://developer.apple.com/reference/uikit/uisplitviewcontroller
http://nshipster.cn/uisplitviewcontroller/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容