CAGradientLayer + CAShapeLayer 实

2021-08-23  本文已影响0人  风吹柳絮如花落
class LoadingView: UIView {
    
    // 主layer
    var shapeLayer:CAShapeLayer!
    // 圆形layer
    var layer1:CAShapeLayer!

    override func awakeFromNib() {
        super.awakeFromNib()
        setUI()
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        shapeLayer.frame = self.bounds
        // 创建梯形layer
        let leftLayer = CAGradientLayer()
        leftLayer.frame  = CGRect.init(x: 0, y: 0, width: self.frame.size.width / 2, height: self.frame.size.width)// CGRectMake(0, 0, 240, 120)
        leftLayer.colors = [UIColor.init(white: 1, alpha: 0.5).cgColor, UIColor.init(white: 1, alpha: 1).cgColor]
        leftLayer.startPoint = CGPoint.init(x: 0, y: 0)// CGPointMake(0, 0.5)
        leftLayer.endPoint   = CGPoint.init(x: 0, y: 1)//CGPointMake(1, 0.5)
        shapeLayer.addSublayer(leftLayer)
        
        let rightLayer = CAGradientLayer()
        rightLayer.frame  = CGRect.init(x: self.frame.size.width / 2, y: 0, width: self.frame.size.width / 2, height: self.frame.size.width)// CGRectMake(0, 120, 240, 120)
        rightLayer.colors = [UIColor.init(white: 1, alpha: 0.6).cgColor, UIColor.init(white: 1, alpha: 0).cgColor]
        rightLayer.startPoint = CGPoint.init(x: 0, y: 0)// CGPointMake(0, 0.5)
        rightLayer.endPoint   = CGPoint.init(x: 0, y: 1)// CGPointMake(1, 0.5)
        shapeLayer.addSublayer(rightLayer)
        
        // 创建一个圆形layer
        layer1 = CAShapeLayer()
        layer1.frame = self.bounds
        layer1.path = UIBezierPath(arcCenter: CGPoint.init(x: self.frame.size.width / 2, y: self.frame.size.width / 2), radius: self.frame.size.width / 2 - 2, startAngle: 0, endAngle: 2 * CGFloat(Double.pi), clockwise: true).cgPath
        layer1.lineWidth    = 2

        layer1.lineJoin     = CAShapeLayerLineJoin.round
        layer1.strokeColor  = UIColor.black.cgColor
        layer1.fillColor    = UIColor.clear.cgColor
        layer1.strokeEnd    = 1
        
        // 根据laery1 的layer形状在 shaperLayer 中截取出来一个layer
        shapeLayer.mask = layer1
    }
    
    func setUI() {
        shapeLayer = CAShapeLayer()
        self.layer.addSublayer(shapeLayer)
    }
    
    var isAnimated: Bool = false
    
    /**
     旋转动画
     */
    func startLoading() {
        
        if isAnimated {
            return
        }
        
        isAnimated = true
        
        let animation = CABasicAnimation(keyPath: "transform.rotation.z")
        animation.isRemovedOnCompletion = false
        animation.fromValue = 2 * Double.pi
        animation.toValue   =  0
        animation.duration = 1.25
        animation.repeatCount = HUGE
        self.layer.add(animation, forKey: "")
    }
    func endLoading() {
        isAnimated = false
        self.layer.removeAllAnimations()
    }
    
}

上一篇下一篇

猜你喜欢

热点阅读