ScrollingStackViewController
ScrollingStackViewController
是一个方便的替代品,适用于大多数 UITableViewController
用例,特别是在您需要构建具有有限数量、动态和丰富的“单元格”的滚动控制器时。
动机
在需要显示大量相对简单的单元格时,UITableViewController
很好。有时,您可能只想将视图控制器垂直分割成几个部分。这些部分可能极为异质和复杂,数量明确,但您仍然想根据情况进行显示和隐藏。您可以使用 UITableViewController
来实现这一点,但实际上它会变得很尴尬。
- 这里的“数据源模式”过于繁琐。您可以直接添加您的部分并显示/隐藏它们,无需通过
cellForRow:at:
、表视图更新等。当您想要显示和隐藏不同的单元格时,乱七八糟的索引通常会导致错误和崩溃,有时还有困难来优雅地动画化。 - 很难很好地分割代码。`UITableViewCell` 属于视图层,因此您必须将 Controller 部分保留在包含视图控制器中,这样您就没有分割 Controller 层,或者您必须腐化 `UITableViewCell` 并在其中放置 Controller 代码。在任一情况下——都不是胜利者。
上述问题通过ScrollingStackViewController
提供的解决方案是:使用子视图控制器,这样就可以真实独立地保持自己的控制器代码,同时使用UIStackView
处理布局和UIScrollView
处理滚动。它是一个简单的类,提供了所有的框架支持,旨在处理UIKit通常会带来的各种怪异问题。
我们邀请您查看Just Eat UK应用中的“订单详情”页面,其中每个部分都是一个子视图控制器,这使得这种页面非常适合使用ScrollingStackViewController
。包含视图控制器只需要知道如何实例化、初始化和添加子控制器。
使用方法
从ScrollingStackViewController
继承。实例化并添加你的子视图控制器。确保你的子视图控制器有实现自动垂直调整大小的约束
class ViewController: ScrollingStackViewController {
var viewController1: UIViewController!
var viewController2: UIViewController!
override func viewDidLoad() {
super.viewDidLoad()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
viewController1 = storyboard.instantiateViewController(withIdentifier: "ChildController1") as! ChildController1
viewController2 = storyboard.instantiateViewController(withIdentifier: "ChildController2") as! ChildController2
add(viewController: viewController1)
add(viewController: viewController2)
}
}
在位置插入子视图控制器。
insert(viewController: viewController3, at: .index(1))
带填充插入子视图控制器(子视图添加到容器视图)。NB:当向带有填充的容器视图添加子视图时,应使用显示/隐藏函数。
insert(viewController: viewController4,
edgeInsets: UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8),
at: .after(viewController3))
删除子视图控制器。NB:也许直接添加你打算使用的所有VC,然后再根据需要显示和隐藏它们会更简单。详见下文。
remove(viewController: viewController3)
使用show(viewController:)
和hide(viewController:)
来显示和隐藏视图控制器。过渡会动画化。
show(viewController: viewController1)
默认动画为持续时间为0.5秒和阻尼系数为1的弹簧动画。你可以覆盖默认的动画闭包。
animate = { animations, completion in
UIView.animate(withDuration: 1, animations: animations, completion: completion)
}
添加间距。
spacingColor = UIColor.lightGray
stackView.spacing = 0.5
添加边框。
borderColor = UIColor.darkGray
borderWidth = 1
以编程方式滚动到子视图控制器。
scrollTo(viewController: viewController2, action: { print("Done scrolling!") })
覆盖滚动动画。
scrollAnimate = { animations, completion in
UIView.animate(withDuration: 1, animations: animations, completion: completion)
}
如果需要执行未快速覆盖的内容,你仍然可以访问堆叠视图、滚动视图和 backing view。
scrollView.alwaysBounceVertical = false
stackView.spacing = 1
stackViewBackgroundView.alpha = 0
要求
ScrollingStackViewController需要iOS 12或更高版本。
安装
CocoaPods
ScrollingStackViewController通过CocoaPods提供。要安装它,只需将以下行添加到你的Podfile中
pod "ScrollingStackViewController"
Swift 包管理器
ScrollingStackViewController 也可通过 SPM 获取。复制此存储库的 URL,并将包添加到您的项目设置中。
许可证
ScrollingStackViewController 在 Apache 许可证 2.0 版本下可用,2004 年 1 月。更多详细信息请参阅 LICENSE 文件。
- Just Eat iOS 团队