UIActivityIndicatorView
是一個(gè)比較簡(jiǎn)單的視圖瑟捣,多用于表示應(yīng)用正在處理某個(gè)任務(wù)中陕悬,比如網(wǎng)絡(luò)請(qǐng)求习柠。
其定義:
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)
// 默認(rèn)樣式是 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, *)
// 定義轉(zhuǎn)動(dòng)菊花顏色
open var color: UIColor!
// 開(kāi)始動(dòng)畫(huà)
open func startAnimating()
// 關(guān)閉動(dòng)畫(huà)
open func stopAnimating()
// 是否正在動(dòng)畫(huà)
open var isAnimating: Bool { get }
}
另外還可以給indicator設(shè)置一個(gè) 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 // 給背景的矩形添加一個(gè)圓角
self.view.addSubview(v)
v.startAnimating() // 開(kāi)始動(dòng)畫(huà)
如果是網(wǎng)絡(luò)請(qǐng)求疏魏,還可以在狀態(tài)欄上添加一個(gè)網(wǎng)絡(luò)活動(dòng)指示器蛉艾,可以設(shè)置 UIApplication
的 isNetworkActivityIndicatorVisible
為 true
, 當(dāng)網(wǎng)絡(luò)活動(dòng)完成后钳踊,再將其設(shè)置為 false
衷敌。
活動(dòng)指示器是一個(gè)比較簡(jiǎn)單的組件,我們不能改變其繪制方式拓瞪。一般要?jiǎng)?chuàng)建自定義活動(dòng)指示器有2種方式:
使用一個(gè)
UIImageView
, 包含一個(gè)動(dòng)畫(huà)圖片(比如gif)-
使用
CAReplicatorLayer
拷貝多個(gè)子圖層缴罗,然后將子圖層進(jìn)行動(dòng)畫(huà),這是一種很常見(jiàn)的方法(UIActivityIndicatorView
實(shí)際也是通過(guò)這種方式實(shí)現(xiàn)的)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) // 將對(duì)這個(gè)圖層進(jìn)行拷貝 let bar = CALayer() bar.frame = CGRect(x: 0, y: 0, width: 10, height: 20) bar.backgroundColor = UIColor.red.cgColor lay.addSublayer(bar) // 將其添加到可復(fù)制圖層中 lay.instanceCount = 5 // 復(fù)制5個(gè) // bar圖層之間的間距是 20 lay.instanceTransform = CATransform3DMakeTranslation(20, 0, 0) // 對(duì)圖層透明度進(jìn)行動(dòng)畫(huà) 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) } }