GradientLoadingBar

Swift5.0 CI Status Code Coverage Version License Platform

一个可自定义的动画渐变加载条。灵感来源于 Codepen 上的 iOS 7 进度条

示例

Example

要运行示例项目,请克隆仓库,并从 Example 目录打开工作区。

要求

注意:如果您需要支持低于 iOS 13 的版本,您可以回退到 2.X.X 版本。

集成

CocoaPods

CocoaPods 是 Cocoa 项目的依赖管理器。有关使用和安装说明,请访问其网站。要使用 CocoaPods 将 GradientLoadingBar 集成到您的 Xcode 项目中,请在您的 Podfile 中指定它。

pod 'GradientLoadingBar', '~> 3.0'
Carthage

Carthage 是一个去中心化的依赖管理器,它可以构建您的依赖项并为您提供二进制框架。要使用 Carthage 将 GradientLoadingBar 集成到您的 Xcode 项目中,请在您的 Cartfile 中指定它。

github "fxm90/GradientLoadingBar" ~> 3.0

运行 carthage update 来构建框架,并将构建的 GradientLoadingBar.framework 拖到您的 Xcode 项目中。

Swift Package Manager

Swift Package Manager 是一种用于自动分发 Swift 代码的工具,它集成到 swift 编译器中。它尚处于早期开发阶段,但 Gradient Loading Bar 确实支持在支持的平台上使用它。

一旦你设置好了你的 Swift 包,添加 Gradient Loading Bar 作为依赖就像把它添加到你的 Package.swiftdependencies 值中一样简单。

dependencies: [
    .package(url: "https://github.com/fxm90/GradientLoadingBar", from: "3.0.0")
]

如何使用

该框架提供四个类

GradientLoadingBar

要开始使用,请将模块 GradientLoadingBar 导入到您的文件中,并将 GradientLoadingBar() 的实例保存在您的视图控制器的属性中。要显示加载条,只需调用 fadeIn(duration:completion) 方法,并在您的异步操作完成后调用 fadeOut(duration:completion) 方法。

final class UserViewController: UIViewController {

    private let gradientLoadingBar = GradientLoadingBar()

    // ...

    override func viewDidLoad() {
        super.viewDidLoad()

        gradientLoadingBar.fadeIn()

        userService.loadUserData { [weak self] _ in
            // ...
            // Be sure to call this on the main thread!
            self?.gradientLoadingBar.fadeOut()
        }
    }
}
配置

您可以通过使用可选参数 heightisRelativeToSafeArea 调用初始化程序来覆盖默认配置。

let gradientLoadingBar = GradientLoadingBar(
    height: 4.0,
    isRelativeToSafeArea: true
)
– 参数 height: CGFloat

通过设置此参数,您可以设置加载条的高度(默认为 3.0

– 参数 isRelativeToSafeArea: Bool

使用此参数,您可以配置加载条是否应相对于安全区域定位(默认为 true)。

isRelativeToSafeArea 设置为 true 的示例。 Example

isRelativeToSafeArea 设置为 false 的示例。 Example

注意

还有第三个选项,它会将加载条包裹在 iPhone 的刘海周围。有关更多详细信息,请参阅类 NotchGradientLoadingBar 的文档。

属性
gradientColors: [UIColor]

此属性调整加载条上显示的渐变颜色。

progressAnimationDuration: TimeInterval

此属性调整动画将渐变从左向右移动的持续时间。

方法
fadeIn(duration:completion)

此方法淡入加载条。 您可以使用相应的参数调整持续时间。 此外,您可以传入一个完成处理程序,该处理程序在动画完成后调用。

fadeOut(duration:completion)

此方法淡出加载条。 您可以使用相应的参数调整持续时间。 此外,您可以传入一个完成处理程序,该处理程序在动画完成后调用。

自定义共享实例 (Singleton)

如果您需要在应用程序的多个/不同部分中使用加载条,您可以使用给定的静态 shared 变量

GradientLoadingBar.shared.fadeIn()

// Do e.g. server calls etc.

GradientLoadingBar.shared.fadeOut()

如果您希望自定义共享实例,您可以将以下代码添加到您的应用程序委托 didFinishLaunchingWithOptions 方法中,并覆盖 shared 变量

GradientLoadingBar.shared = GradientLoadingBar(height: 5.0)

NotchGradientLoadingBar

GradientLoadingBar 的这个子类会将加载条包裹在 iPhone 的刘海周围。

对于没有安全区域的 iPhone,该行为与上述 GradientLoadingBar 的文档中提到的相同。

let notchGradientLoadingBar = NotchGradientLoadingBar(
    height: 3.0
)

Example

GradientActivityIndicatorView

如果您不想将加载条添加到主窗口,此框架提供了 GradientActivityIndicatorView,它是 UIView 的直接子类。您可以将视图添加到另一个视图中,无论是在界面生成器中还是以编程方式。

例如,将 View 作为子视图添加到 UINavigationBarExample

例如,将 View 作为子视图添加到 UIButtonExample

注意

进度动画根据 isHidden 标志开始和停止。 将此标志设置为 false 将启动动画,将其设置为 true 将停止动画。 通常,您不想直接显示/隐藏视图,而是平滑地淡入或淡出。 因此,视图提供了方法 fadeIn(duration:completion)fadeOut(duration:completion)。 基于 gist UIView+AnimateAlpha.swift,这些方法调整视图的 alpha 值并相应地更新 isHidden 标志。

属性
gradientColors: [UIColor]

此属性调整加载条上显示的渐变颜色。

progressAnimationDuration: TimeInterval

此属性调整动画将渐变从左向右移动的持续时间。

要在一个真实的应用程序中查看所有这些屏幕截图,请查看示例应用程序。 对于进一步的自定义,您还可以子类化 GradientLoadingBar 并覆盖方法 setupConstraints()

GradientLoadingBarView

这是 GradientActivityIndicatorView 的 SwiftUI 变体。 可以通过传递给初始化程序的两个参数 gradientColors: [Color]progressDuration: TimeInterval 来配置视图。

gradientColors: [Color]

此参数调整加载条上显示的渐变颜色。

progressDuration: TimeInterval

此参数调整动画将渐变从左向右移动的持续时间。

视图的可见性可以使用视图修饰符 opacity()hidden() 来更新。

要动画化可见性更改,您需要创建一个带有 @State 属性包装器的属性,并从 withAnimation 块更新该值,例如

struct ExampleView: some View {

    @State
    private var isVisible = false

    var body: some View {
        VStack {
            GradientLoadingBarView()
                .frame(maxWidth: .infinity, maxHeight: 3)
                .cornerRadius(1.5)
                .opacity(isVisible ? 1 : 0)

            Button("Toggle visibility") {
                withAnimation(.easeInOut) {
                    isVisible.toggle()
                }
            }
        }
    }
}

故障排除

Interface Builder 支持

不幸的是,Interface Builder 对 Cocoapods 框架的支持目前已损坏。 如果您需要 Interface Builder 支持,请将以下代码添加到您的 Podfile 中并再次运行 pod install。 之后,您应该可以在 Interface Builder 中使用 GradientLoadingBar :)

  post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
      next unless config.name == 'Debug'

      config.build_settings['LD_RUNPATH_SEARCH_PATHS'] = [
        '$(FRAMEWORK_SEARCH_PATHS)'
      ]
    end
  end

来源: Cocoapods – Issue 7606

作者

Felix Mau (me(@)felix.hamburg)

许可证

GradientLoadingBar 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。