美文网首页
swift UIActivityIndicatorView

swift UIActivityIndicatorView

作者: JamesSawyer | 来源:发表于2019-06-11 16:13 被阅读0次

UIActivityIndicatorView 是一个比较简单的视图,多用于表示应用正在处理某个任务中,比如网络请求。

其定义:

import Foundation
import UIKit
import _SwiftUIKitOverlayShims

extension UIActivityIndicatorView {

    
    public enum Style : Int {

        // 大小 CGSize(width: 37, height: 37)
        case whiteLarge

        // 大小 CGSize(width: 22, height: 22)
        case white

        // 大小 CGSize(width: 22, height: 22)
        case gray
    }
}

@available(iOS 2.0, *)
open class UIActivityIndicatorView : UIView, NSCoding {

    
    public init(style: UIActivityIndicatorView.Style) // sizes the view according to the style

    public init(frame: CGRect)

    public init(coder: NSCoder)

    // 默认样式是 UIActivityIndicatorView.Style.white
    open var style: UIActivityIndicatorView.Style // default is UIActivityIndicatorViewStyleWhite

    open var hidesWhenStopped: Bool // default is YES. calls -setHidden when animating gets set to NO

    
    @available(iOS 5.0, *)
    // 定义转动菊花颜色
    open var color: UIColor!

    // 开始动画
    open func startAnimating()

    // 关闭动画
    open func stopAnimating()

    // 是否正在动画
    open var isAnimating: Bool { get }
}

另外还可以给indicator设置一个 backgroundColor

let v = UIActivityIndicatorView(style: .whiteLarge)
v.color = .yellow
Dispatch.main.async {
  v.backgroundColor = UIColor(white: 0.2, alpha: 0.6)
}
v.layer.cornerRadius = 10 // 给背景的矩形添加一个圆角
self.view.addSubview(v)
v.startAnimating() // 开始动画

如果是网络请求,还可以在状态栏上添加一个网络活动指示器,可以设置 UIApplicationisNetworkActivityIndicatorVisibletrue, 当网络活动完成后,再将其设置为 false

活动指示器是一个比较简单的组件,我们不能改变其绘制方式。一般要创建自定义活动指示器有2种方式:

  1. 使用一个 UIImageView, 包含一个动画图片(比如gif)

  2. 使用 CAReplicatorLayer 拷贝多个子图层,然后将子图层进行动画,这是一种很常见的方法(UIActivityIndicatorView 实际也是通过这种方式实现的)

    import UIKit
    
    class ViewController: UIViewController {
      override func viewDidLoad() {
        super.viewDidLoad()
      }
      
      override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let lay = CAReplicatorLayer()
        lay.frame = CGRect(x: 0, y: 0, width: 100, height: 20)
        
        // 将对这个图层进行拷贝
        let bar = CALayer()
        bar.frame = CGRect(x: 0, y: 0, width: 10, height: 20)
        bar.backgroundColor = UIColor.red.cgColor
        lay.addSublayer(bar) // 将其添加到可复制图层中
        lay.instanceCount = 5 // 复制5个
        // bar图层之间的间距是 20
        lay.instanceTransform = CATransform3DMakeTranslation(20, 0, 0)
        // 对图层透明度进行动画
        let anim = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
        anim.fromValue = 1.0
        anim.toValue = 0.2
        anim.duration = 1
        anim.repeatCount = .greatestFiniteMagnitude
        bar.add(anim, forKey: nil)
        lay.instanceDelay = anim.duration / Double(lay.instanceCount)
        
        self.view.layer.addSublayer(lay)
        lay.position = CGPoint(x: self.view.layer.bounds.midX, y: self.view.layer.bounds.midY)
      }
    }
    
indicator.gif

相关文章

网友评论

      本文标题:swift UIActivityIndicatorView

      本文链接:https://www.haomeiwen.com/subject/abbqfctx.html