ViewElements
一个用于在 iOS 应用中管理和重用 UIView 的框架。
// 0. Subclass TableModelViewController
class ViewController: TableModelViewController {
override func setup() {
// 1. Create a Row, this is a built-in label element, support multiple lines by default
let titleRow = Row(ElementOfLabel(props: "Hello!"))
// 2. You can customize
let messageRow = Row(ElementOfLabel(props: "This is awesome").styles({ (lb) in
lb.textColor = .black
lb.font = UIFont.systemFont(ofSize: 12)
lb.textAlignment = .center
lb.numberOfLines = 1
}))
messageRow.backgroundColor = .gray
messageRow.layoutMarginStyle = .each(vertical: 4, horizontal: 12)
messageRow.rowHeight = 44
// 3. For a custom element, you will need to declare type of props in MyCustomView, it can be anything, like a tuple.
let customProps = ("Wow", "This", "Is so flexible!")
let customRow = Row(ElementOf<MyCustomView>(props: customProps))
...
// 4. To create a section header
let header = SectionHeader(ElementOfLabel(props: "Easy header"))
// 5. Building up Section
let section = Section(header: header, footer: nil, rows: [titleRow, messageRow, ...])
// 6. Building up Table
let table = Table(sections: [section]])
// 7. Then it works from this moment on!
self.table = table
}
}
特性
- 一旦设置视图,即可在任何地方使用
🎉 例如:- 行(UITableViewCell)
- 分区头,分区脚(UITableHeaderFooterView)
- tableHeaderView
- 内置键盘避免功能
- 解决这些问题
- 隐藏尾部分隔符(默认行为)
- 分隔符样式
- 自动布局(如果您创建自定义视图,则必须自行设置正确的自动布局)
- 居中 tableview 的内容(如果可能的话,禁用滚动)
- 在 cell 显示后自动更新 estimatedRowHeight
安装
将其添加到 Podfile 中:
pod 'ViewElements'
概述
大多数 iOS UI 都可以通过 UITableView 解决。此框架将各种视图抽象为易于使用的视图模型,如 Row、SectionHeader、SectionFooter,您可以将这些模型组合起来快速构建一个 UITableView。
元素
ViewElement为UIView的表示提供了一个通用抽象,称为元素。元素包含Props,这是一种用于配置视图的数据结构。此框架已经提供了基本的UIKit元素,如UILabel、UIImageView、UIButton、UITextField、UIActivityIndicatorView。(你会惊讶于仅通过将这些基本元素堆叠在一起就能完成多少事情。)
然后,可以通过将元素封装在ElementContainers中在表格视图中使用元素。
- Row(element)
- SectionHeader(element)
- SectionFooter(element)
- TableHeaderView(element)。
大多数容器默认使用自动布局。但如果你事先知道高度,可以在这些容器上设置rowHeight。
组件
元素行填充整个单元格水平方向,如果你需要放置两个元素并排放置怎么办呢?
你可以使用组件将元素水平堆叠,这是Element的一个子类。它可以用于Element可以使用的任何地方。组件要求你返回一个由StackProps组成的层次结构——UIStackView的抽象。
内部为每个StackProps创建UIStackView并将它们嵌套在一起。
PS:虽然栈视图解决了许多自动布局问题,但如果组件非常复杂,请考虑从nib文件中创建元素。
PS2:目前组件不支持像React那样在视图树中更改,组件仅作为将元素通过嵌套组合在一起的方式。
限制
目前,此框架适合创建静态页面,例如,内容没有状态/交互。最终,它只是UITableView。对于高度灵敏的页面(具有许多手势),请考虑其他选项。
路线图
- 我正在尝试将此与RxSwift结合使用,它允许我们在创建数据驱动页面(例如,任何类型的输入表单,具有响应性)时使用ViewElements。我们的想法是在propsType中使用Rx配置块,而不是固定的、有状态变量,如String。例如(响应式)-> [Disposable]。
- 支持UICollectionView
然后你可以在元素创建时设置所有你的Rx东西。不过,你需要自己实现RxLabel,并在那里管理DisposeBag。
入门
1. 创建一个与该框架一起使用的视图
- 创建一个子类BaseNibView的UIView nib(用于程序化创建UIView,子类BaseView)
- 定义PropsType
- 实现设置/更新函数
(...进行中,目前请先查看示例)
示例
查看'ViewElements/Examples'。
替代方案
你可以考虑这些替代品,可能比这个框架更优雅哦
- Eureka,用于表单构建
- SwiftForms,用于表单构建
- Leego,通用,与该框架非常相似,但尚未深入研究
- BrickKit,功能非常通用,用collection view构建,应该是这样
那么为什么是ViewElements呢?
使用简单易懂(希望是这样)。没有太多魔法。如果你知道如何使用UITableView,那么你就可以立刻开始。