UISplitViewController 的 API 文档不长,我们可以过一遍其中一些重要属性和方法的含义。
// iOS14 的初始化方法,传入列数
@available(iOS 14.0, *)
public init(style: UISplitViewController.Style)
// UISplitViewController的代理方法,下面会有用法说明
weak open var delegate: UISplitViewControllerDelegate?
// Default NO. The secondary-only shortcut button is applicable only for UISplitViewControllerStyleTripleColumn
@available(iOS 14.0, *)
open var showsSecondaryOnlyButton: Bool
// 设置某一列的 vc,如果vc 不是导航控制器,系统会默认给我们嵌套上一个导航控制器
@available(iOS 14.0, *)
open func setViewController(_ vc: UIViewController?, for column: UISplitViewController.Column) // If the vc is not a UINavigationController, one will be created, except for UISplitViewControllerColumnCompact.
/*
-hideColumn: and -showColumn: do not accept the Compact column
显示或者隐藏某一列,在紧凑和常规的视图有不同的处理,iOS14可用
*/
@available(iOS 14.0, *)
open func hide(_ column: UISplitViewController.Column)
@available(iOS 14.0, *)
open func show(_ column: UISplitViewController.Column)
// 实际上是调用的 -setViewController:forColumn: ,通常在初始化的时候可以定义好一个vc数组
// viewControllers 在控制器折叠和展开变化的时候会改变,折叠的时候只有一个,展开的时候有多个。
open var viewControllers: [UIViewController] // -setViewController:forColumn:/-viewControllerForColumn: recommended for column-style UISplitViewController
// 在主控制器隐藏在左边的情况下,可以右滑手势拉出来 Defaults to 'YES'.
@available(iOS 5.1, *)
open var presentsWithGesture: Bool
// 当前的控制器是折叠还是展开
@available(iOS 8.0, *)
open var isCollapsed: Bool { get }
// 偏好的显示风格,上文已经解释用法
@available(iOS 8.0, *)
open var preferredDisplayMode: UISplitViewController.DisplayMode
// 当前的显示风格
// The actual current displayMode of the split view controller. This will never return `UISplitViewControllerDisplayModeAutomatic`.
@available(iOS 8.0, *)
open var displayMode: UISplitViewController.DisplayMode { get }
// 系统默认的展开和收起的按钮,会根据不同的 displaymode 显示不同的样式
@available(iOS 8.0, *)
open var displayModeButtonItem: UIBarButtonItem { get }
// 设置主控制器的宽度比例,0.0 ~ 1.0,设置为1.0的时候为 maximumPrimaryColumnWidth,宽度值会在 mix 和 max 之间
@available(iOS 8.0, *)
open var preferredPrimaryColumnWidthFraction: CGFloat // default: UISplitViewControllerAutomaticDimension
// 优先级高于 preferredPrimaryColumnWidthFraction,可以设置偏好的宽度值
@available(iOS 14.0, *)
open var preferredPrimaryColumnWidth: CGFloat // default: UISplitViewControllerAutomaticDimension
// 主控制器的最小宽度
@available(iOS 8.0, *)
open var minimumPrimaryColumnWidth: CGFloat // default: UISplitViewControllerAutomaticDimension
// 主控制器的最大宽度
@available(iOS 8.0, *)
open var maximumPrimaryColumnWidth: CGFloat // default: UISplitViewControllerAutomaticDimension
// 当前主控制器的宽度
@available(iOS 8.0, *)
open var primaryColumnWidth: CGFloat { get }
// 主控制器靠左边还是靠右边,默认左边
@available(iOS 11.0, *)
open var primaryEdge: UISplitViewController.PrimaryEdge // default: UISplitViewControllerPrimaryEdgeLeading
// 替换主控制器
// apple 建议尽量使用这个方法,不要直接修改 viewControllers 来替换主控制器
// 默认会先调用代理的 splitViewController(_:show:sender:) 代理方法,如果代理返回了 true,那么替换由代理实现,不会再做任何操作,如果返回 false 不进行自定义,就会触发系统的替换方案:
// 在 compact 紧凑型的时候,就是present。
// 在 regular 常规型的时候, 分栏控制器将vc作为primary主控制器,除非vc已经是主控制器的子控制器。在这种情况下,它将vc安装为二级控制器。
// ps: 因为 UIsplitViewController 的特性,如果 vc 不是导航控制器,会默认嵌套一个导航控制器
@available(iOS 8.0, *)
open func show(_ vc: UIViewController, sender: Any?)
// apple 建议尽量使用这个方法,不要直接修改 viewControllers 来替换二级控制器
// 默认会先调用代理的 splitViewController(_:showDetail:sender:) 代理方法,如果代理返回了 true,那么替换由代理实现,不会再做任何操作,如果返回 false 不进行自定义,方法就会转发给被替换的视图控制器,如果控制器没有处理,就会走系统默认方案:
// 在 compact 紧凑型的时候,就是present。
// 在 regular 常规型的时候,分栏控制器将vc作为secondary二级控制器。
// ps: 所有的 UIViewController 都有 showDetailViewController 这个方法,如果自己没有实现,就会往外层vc传递,所以我们可以在任意一个 vc 上调用这个方法,和直接调用 UISplitViewController 的这个方法一样。
@available(iOS 8.0, *)
open func showDetailViewController(_ vc: UIViewController, sender: Any?)