DSLoadable 2.0.0

DSLoadable 2.0.0

MaherKSantina 维护。



  • MaherKSantina

DSLoadable

dsloadabledemo

简介

为了给用户带来极佳的用户体验,我们需要对几乎所有进行异步工作的元素使用非阻塞加载器。我们倾向于避免通过整个视图的大加载器阻塞这种类型加载。我们不希望手动在每个子视图上添加加载视图,管理这些视图将会非常困难。此仓库提供完全可定制的函数和方法,允许您轻松地对任何 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:您可以在将视图放入层次结构之前在此函数中操作加载视图

为按钮显示默认加载器

buttondefaultloading

如果您想使用一个简单的加载器,不添加任何您觉得是花哨的东西,您可以使用库中内建的加载器。上述功能可以像这样实现:

@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
}

添加自定义加载视图

buttoncustomloading

您可以将任何加载视图/库集成到逻辑中。在上面的例子中,我使用了令人惊叹的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文件。