概述
StackViewController
是一个 Swift 框架,它简化了使用 UIStackView
构建表单和其他静态内容的过程。例如,下面的表单是使用 StackViewController 实现的
设计理念
本项目的目的是双重的:鼓励构建如图上表单所示的内容时更适合的设计模式,并提供简化此过程的工具。以下部分包含现有解决方案的总结以及我们如何改进它们。
用UITableView构建表单(困难重重)
传统上,iOS开发者使用
另一个主要问题是使用
总之,
介绍UIStackView
UIStackView
于iOS 9中引入,提供了一个用于水平或垂直堆叠视图的Autolayout干净的抽象。通过组合多个实例的UIStackView
,可以相当容易地构建大多数常见的用户界面布局,而无需手动创建和删除布局约束。
UIStackView
非常适合构建表单和其他静态内容,但当应用于特定用途时,它存在一些缺点。有一些UIStackView
内置这些功能,因此这个库的一个目标是填补这些关键缺失的功能,使得使用堆叠视图比使用表视图进行同一任务更加容易。
视图控制器优于视图
一个iOS代码设计欠佳的强烈指标是视图和视图控制器之间责任划分不当,这符合MVC(模型-视图-控制器)模式。所谓的《大规模视图控制器》反模式就是一个很常见的现象,其中视图控制器处理了太多的事情,吸收了模型和视图层的责任。相反,也存在一种反模式,即视图承担了太多与控制器类似的责任,而不是仅仅关注内容的布局和渲染。
StackViewController
定义了一个单一
API,用于使用UIView
和UIViewController
实例来提供内容。当显示的内容简单且非交互式(例如静态标签)时,可以使用UIView
实例。UIViewController
实例适用于更复杂的控件,当需要控制器的同时还要有视图时,比如视图显示一个从模型那里更新用户通过视图交互的状态的可视表示。
视图控制器组合
组合优于继承是面向对象编程的一个基本原则。
这个原则一直被用于iOS视图层次结构中,其中更复杂的视图由更简单的视图组合而成(例如UIButton
包含了渲染其内容的UILabel
和UIImageView>)。然而,在iOS 5引入了视图控制器嵌套功能之前,并没有“官方”的方式来组合视图控制器。在iOS 5之前,可以模拟这一行为,但在父视图控制器和子视图控制器之间处理事件传播和子视图控制器之间的转换是困难重重的,这些都是视图控制器嵌套API解决的问题。
正如您可以创建通过组合多个UIStackView
实例的复杂布局一样,您可以使用视图控制器嵌套API来组合多个StackViewController
实例,从而创建一个视图控制器层次结构,其中每个内容视图都有一个对应的视图控制器作为后盾,干净地划分了责任,而不是像之前提到的那样在视图级别处理所有这些事情。
特性
该框架提供两个主要类:StackViewContainer
和StackViewController
。StackViewContainer
包装一个UIStackView
并实现了以下附加功能
- 滚动支持通过在
UIScrollView
中嵌入UIStackView
并自动管理关联的约束来实现 - 自动滚动行为在键盘出现时自动调整布局并滚动到正在编辑的视图(与
UITableViewController
实现的行为相同) - 可定制的分隔视图可以在每个视图的基础上切换,当内容视图插入和删除时自动管理
- 其他小便利之处,例如支持背景视图和更改背景颜色(因为
UIStackView
不绘制背景)。
StackViewController
是 UIViewController
的子类,它使用 StackViewContainer
实例作为其视图,并增加了支持使用 视图控制器包含 来添加内容(即视图控制器组合)。这意味着您可以使用视图控制器和/或视图来表示您的视觉内容,而不仅仅是视图,并且 StackViewController
会自动处理添加和移除它们作为子视图控制器。
示例
上面的示例应用展示了如何使用 StackViewContainer
(图像附件控件)以及 StackViewController
(完整格式)。
许可
本项目采用 MIT 许可证。有关详细信息,请参见 LICENSE.md
文件。