2023-12-21动画

2023-12-20  本文已影响0人  YN吾爱

注意点,防止动作完成后返回原始点

        animationGroup.fillMode = .forwards //要配合使用 forwards  isRemovedOnCompletion

        animationGroup.isRemovedOnCompletion = false // 是否在动画完成后从 Layer 层上移除  回到最开始状态

importUIKit

///请求成功返回闭包

public typealias AnimationFinishClosure = () -> Void

class LWAnimationTool: NSObject {

    public static let shared = LWAnimationTool()

    var layer:CATextLayer? = CATextLayer()

    private override init() {

        super.init()

    }

    func carAnimation(startView:UIView,endView:UIView,duration:CGFloat,finish:AnimationFinishClosure){

        letstartPoint =getPoint(view: startView)

        letendPoint =getPoint(view: endView)

//        let startPoint = CGPointMake(100, 100)

//        let endPoint = CGPointMake(200, 600)

        letwindow:UIWindow=keyWindow()

        if(layer==nil){

            layer=CATextLayer()

        }

        layer!.alignmentMode = .center//文字对齐方式

        layer!.contentsGravity = .resizeAspectFill;

        layer!.backgroundColor = UIColor.red.cgColor

        layer!.bounds=CGRect(x: -100,y: -20,width: 16,height: 16)

        layer!.cornerRadius = 8;

        layer!.masksToBounds = true;

        window.layer.addSublayer(layer!)

        //初始化旋转动画

//        let animation = CABasicAnimation(keyPath: "transform.rotation.z")

//        //设置属性

//        animation.toValue = NSNumber(value: Double.pi * 11)

//        animation.duration = duration

//        animation.isCumulative = true;

//        animation.repeatCount = 0;

        //初始化抛物线动画

        letpathAnimation =CAKeyframeAnimation(keyPath:"position")

        //抛物线的顶点,可以根据需求调整

        letcontrolPoint =CGPointMake(startPoint.x- 80, startPoint.y- 80);

        //生成路径

        letpath =UIBezierPath();

        //描述路径

        path.move(to: startPoint)

        path.addQuadCurve(to: endPoint,controlPoint: controlPoint)

        //设置属性

//        pathAnimation.duration = duration

        pathAnimation.path= path.cgPath

//        pathAnimation.fillMode = .forwards //要配合使用 forwards  isRemovedOnCompletion

//        pathAnimation.isRemovedOnCompletion = false // 是否在动画完成后从 Layer 层上移除  回到最开始状态

        //缩放

        letscaleAnimation =CABasicAnimation(keyPath:"transform.scale")

        scaleAnimation.fromValue= 1.0

        scaleAnimation.toValue= 0.2

        scaleAnimation.beginTime= 0.1

//        scaleAnimation.fillMode = .forwards

//        scaleAnimation.isRemovedOnCompletion = false

//        scaleAnimation.duration = duration

        //透明度

        letalphaAnimation =CABasicAnimation(keyPath:"opacity")

        alphaAnimation.fromValue= 1.0

        alphaAnimation.toValue= 0.1

//        alphaAnimation.fillMode = .forwards

//        alphaAnimation.isRemovedOnCompletion = false

        //初始化动画组

        letanimationGroup =CAAnimationGroup()

//        animationGroup.animations = [animation,pathAnimation]

        animationGroup.animations= [pathAnimation,scaleAnimation,alphaAnimation]

        animationGroup.fillMode = .forwards //要配合使用 forwards  isRemovedOnCompletion

        animationGroup.isRemovedOnCompletion = false // 是否在动画完成后从 Layer 层上移除  回到最开始状态

        animationGroup.duration= duration

        animationGroup.delegate=self

        layer!.add(animationGroup,forKey:"group")

        DispatchQueue.main.asyncAfter(deadline: .now() + duration) {

            self.layer!.removeFromSuperlayer()

        }

    }

    funcgetPoint(view:UIView) ->CGPoint{

        letwindow:UIWindow=keyWindow()

        letrect = window.convert(view.frame,from: view.superview)

        letpoint =CGPoint(x: rect.origin.x,y: rect.origin.y)

        returnpoint

    }

}

extension LWAnimationTool: CAAnimationDelegate{

    funcanimationDidStop(_anim:CAAnimation,finishedflag:Bool) {

//        layer = nil

//        let an = layer!.animation(forKey: "group")

//        if(anim == layer!.animation(forKey: "group")){

//            layer!.removeFromSuperlayer()

//            layer = nil

//        }

    }

}

上一篇 下一篇

猜你喜欢

热点阅读