SeedStackViewController 0.6.0

SeedStackViewController 0.6.0

测试已测试
语言语言 SwiftSwift
许可证 NOASSERTION
发布最后发布2021年10月
SPM支持 SPM

维护者 OpsLouis VeraDevin McKaskle



  • Seed

StackViewController Carthage compatible CocoaPods Compatible

概述

StackViewController 是一个 Swift 框架,它简化了使用 UIStackView 构建表单和其他静态内容的过程。例如,下面的表单是使用 StackViewController 实现的

StackViewController Example App

设计理念

本项目的目的是双重的:鼓励构建如图上表单所示的内容时更适合的设计模式,并提供简化此过程的工具。以下部分包含现有解决方案的总结以及我们如何改进它们。

用UITableView构建表单(困难重重)

传统上,iOS开发者使用来构建表单和其他相对静态的基于列表的用户界面,尽管 API对于此类任务并不适合。主要设计用于动态内容,其所提供的大部分功能对动态内容来说是必需的。用它来构建静态用户界面会导致在实现大量数据源和代理方法时产生大量的模板代码。

另一个主要问题是使用实现可变高度内容的困难。例如,当构建表单时,一个常见需求是能够显示一个尺寸随内部内容变化而自动变化的场(例如,一个文本视图)。问题的一半是如何调整cell的大小——这通常是通过在学习的方法heightForRowAtIndexPath:中手动计算大小,或者通过使用Autolayout、估计的行高度和iOS 8中引入的自适应表视图cell功能来完成的。问题的一半是通知表视图当cell内的内容发生变化时应该更新布局。这可能涉及到调用的方法beginUpdates和endUpdates等不平凡的hack,以强制重新布局。

总之,不是这项工作的正确工具

介绍UIStackView

UIStackView于iOS 9中引入,提供了一个用于水平或垂直堆叠视图的Autolayout干净的抽象。通过组合多个实例的UIStackView,可以相当容易地构建大多数常见的用户界面布局,而无需手动创建和删除布局约束。

UIStackView非常适合构建表单和其他静态内容,但当应用于特定用途时,它存在一些缺点。有一些提供的东西是我们通常认为理所当然的:支持滚动、cell分隔符等便捷功能。UIStackView内置这些功能,因此这个库的一个目标是填补这些关键缺失的功能,使得使用堆叠视图比使用表视图进行同一任务更加容易。

视图控制器优于视图

一个iOS代码设计欠佳的强烈指标是视图和视图控制器之间责任划分不当,这符合MVC(模型-视图-控制器)模式。所谓的《大规模视图控制器》反模式就是一个很常见的现象,其中视图控制器处理了太多的事情,吸收了模型和视图层的责任。相反,也存在一种反模式,即视图承担了太多与控制器类似的责任,而不是仅仅关注内容的布局和渲染。

StackViewController定义了一个单一API,用于使用UIViewUIViewController实例来提供内容。当显示的内容简单且非交互式(例如静态标签)时,可以使用UIView实例。UIViewController实例适用于更复杂的控件,当需要控制器的同时还要有视图时,比如视图显示一个从模型那里更新用户通过视图交互的状态的可视表示。

视图控制器组合

组合优于继承是面向对象编程的一个基本原则。

这个原则一直被用于iOS视图层次结构中,其中更复杂的视图由更简单的视图组合而成(例如UIButton包含了渲染其内容的UILabelUIImageView>)。然而,在iOS 5引入了视图控制器嵌套功能之前,并没有“官方”的方式来组合视图控制器。在iOS 5之前,可以模拟这一行为,但在父视图控制器和子视图控制器之间处理事件传播和子视图控制器之间的转换是困难重重的,这些都是视图控制器嵌套API解决的问题。

正如您可以创建通过组合多个UIStackView实例的复杂布局一样,您可以使用视图控制器嵌套API来组合多个StackViewController实例,从而创建一个视图控制器层次结构,其中每个内容视图都有一个对应的视图控制器作为后盾,干净地划分了责任,而不是像之前提到的那样在视图级别处理所有这些事情。

特性

该框架提供两个主要类:StackViewContainerStackViewControllerStackViewContainer包装一个UIStackView并实现了以下附加功能

  • 滚动支持通过在UIScrollView中嵌入UIStackView并自动管理关联的约束来实现
  • 自动滚动行为在键盘出现时自动调整布局并滚动到正在编辑的视图(与UITableViewController实现的行为相同)
  • 可定制的分隔视图可以在每个视图的基础上切换,当内容视图插入和删除时自动管理
  • 其他小便利之处,例如支持背景视图和更改背景颜色(因为 UIStackView 不绘制背景)。

StackViewControllerUIViewController 的子类,它使用 StackViewContainer 实例作为其视图,并增加了支持使用 视图控制器包含 来添加内容(即视图控制器组合)。这意味着您可以使用视图控制器和/或视图来表示您的视觉内容,而不仅仅是视图,并且 StackViewController 会自动处理添加和移除它们作为子视图控制器。

示例

上面的示例应用展示了如何使用 StackViewContainer(图像附件控件)以及 StackViewController(完整格式)。

许可

本项目采用 MIT 许可证。有关详细信息,请参见 LICENSE.md 文件。