DSLoadable
简介
为了给用户带来极佳的用户体验,我们需要对几乎所有进行异步工作的元素使用非阻塞加载器。我们倾向于避免通过整个视图的大加载器阻塞这种类型加载。我们不希望手动在每个子视图上添加加载视图,管理这些视图将会非常困难。此仓库提供完全可定制的函数和方法,允许您轻松地对任何 UIView 显示加载器。您还可以将另一个项目中喜欢的加载动画插入进来!
示例
要运行示例项目,请克隆此仓库,然后首先从 Example 目录运行 pod install
需求
安装
DSLoadable通过CocoaPods提供。要安装它,请简单地将以下行添加到您的Podfile中:
pod 'DSLoadable'
特性
此仓库提供了一种协议,它为所有视图提供了默认的扩展实现
public protocol DSLoadable {
func loadableStartLoading(loadingViewType: UIView.Type, configuration: DSLoadableConfiguration?)
func loadableStopLoading(loadingViewType: UIView.Type)
}
loadingViewType
:将要显示在视图上方的加载器的视图类型configuration
:您可以在将视图放入层次结构之前在此函数中操作加载视图
为按钮显示默认加载器
如果您想使用一个简单的加载器,不添加任何您觉得是花哨的东西,您可以使用库中内建的加载器。上述功能可以像这样实现:
@IBOutlet weak var submitButton: UIButton!
@IBAction func submitDidPress(_ sender: Any?){
submitButton.loadableStartLoading()
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.submitButton.loadableStopLoading()
}
}
此加载器会自动获取按钮的文本颜色和背景颜色,并据此更新加载视图。这种配置在DSDefaults
结构中以public static
声明,您可以为其他东西使用它。
static let buttonConfiguration: DSLoadableConfiguration = {
selfView, loadingView in
guard let lView = loadingView as? DSLoadingView, let selfButton = selfView as? UIButton else {
return
}
lView.layer.cornerRadius = selfButton.layer.cornerRadius
lView.clipsToBounds = selfButton.clipsToBounds
lView.indicatorView.color = selfButton.titleColor(for: .normal)
lView.indicatorView.backgroundColor = selfButton.backgroundColor
}
添加自定义加载视图
您可以将任何加载视图/库集成到逻辑中。在上面的例子中,我使用了令人惊叹的NVActivityIndicatorView,它有许多惊人的动画。该示例可以像这样实现:
@IBOutlet weak var submitButton: UIButton!
@IBAction func submitDidPress(_ sender: Any?){
submitButton.loadableStartLoading { (selfView) -> UIView in
let activityView = NVActivityIndicatorView(frame: submitButton.bounds, type: .lineScale, color: UIColor.white, padding: 12)
activityView.backgroundColor = submitButton.backgroundColor
activityView.startAnimating()
return activityView
}
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.submitButton.loadableStopLoading(loadingViewType: NVActivityIndicatorView.self, configuration: {
selfView, loadingView in
guard let v = loadingView as? NVActivityIndicatorView else {
return
}
v.stopAnimating()
})
}
}
重要的是要注意,loadableStartLoading
函数有两个版本
func loadableStartLoading(loadingViewType: UIView.Type, configuration: DSLoadableConfiguration?)
当您为此函数传入loadingViewType
时,DSLoadable
扩展将自动使用init(frame:)
调用视图类型,然后将其添加到视图层次结构中。在上面的例子中,NVActivityIndicatorView
没有实现init(frame:)
。因此,如果我们尝试使用此函数,它将会崩溃。为了解决这个问题,我们使用以下函数。
func loadableStartLoading(configuration: DSLoadingViewFromConfiguration)
此函数接受配置块。此闭包将返回一个将被添加到视图层次结构中的UIView
。这样,我们可以调用NVActivityIndicatorView
自定义初始化函数(init(frame:,type:,color:,padding:)
)并从闭包中返回最终视图。在闭包执行完成后,NVActivityIndicatorView
将自动使用约束添加到视图层次结构中。
显示任何视图的加载器
显示UIVIew的加载器与显示UIButton的加载器工作原理完全相同。您可以使用默认的加载器,也可以添加自定义的加载器。
作者
MaherKSantina,[email protected]
许可
DSLoadable在MIT许可下可用。有关更多信息,请参阅LICENSE文件。