2023-12-21动画
注意点,防止动作完成后返回原始点
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
// }
}
}