博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS自定义转子动画—OC&Swift
阅读量:6093 次
发布时间:2019-06-20

本文共 3152 字,大约阅读时间需要 10 分钟。

前言

开发中经常需要加载数据,这时候就需要一个加载动画,最近写了2个加载动画,希望对大家有所帮助。文章末尾有提供OC和Swift双语的下载,代码比较简单,就不详细解析了,Demo中已经进行封装,可以直接使用,这里贴出核心代码。

效果图

1.第一个

核心代码

private func initLayer() -> Void {        let origin_x: CGFloat = frame.size.width * 0.5        let origin_y: CGFloat = frame.size.height * 0.5        for item in 0 ..< defaultConfigure.number {            //创建layer            let scale: CGFloat = CGFloat(defaultConfigure.number + 1 - item) / CGFloat(defaultConfigure.number + 1)            let layer: CALayer = CALayer()            layer.backgroundColor = defaultConfigure.backgroundColor.cgColor            layer.frame = CGRect.init(x: -5000, y: -5000, width: scale * defaultConfigure.diameter, height: scale * defaultConfigure.diameter)            layer.cornerRadius = scale * defaultConfigure.diameter * 0.5;            //运动路径            let pathAnimation: CAKeyframeAnimation = CAKeyframeAnimation.init(keyPath: "position")            pathAnimation.calculationMode = .paced;            pathAnimation.fillMode = .forwards;            pathAnimation.isRemovedOnCompletion = false;            pathAnimation.duration = (defaultConfigure.duration) - Double((defaultConfigure.intervalDuration) * Double(defaultConfigure.number));            pathAnimation.beginTime = Double(item) * defaultConfigure.intervalDuration;            pathAnimation.timingFunction = CAMediaTimingFunction.init(name: .easeInEaseOut)            pathAnimation.path = UIBezierPath(arcCenter: CGPoint.init(x: origin_x, y: origin_y), radius: (self.frame.size.width - self.defaultConfigure.diameter) * 0.5, startAngle: defaultConfigure.startAngle, endAngle: defaultConfigure.endAngle, clockwise: true).cgPath            //动画组,动画组时间长于单个动画时间,会有停留效果            let group: CAAnimationGroup = CAAnimationGroup()            group.animations = [pathAnimation]            group.duration = defaultConfigure.duration            group.isRemovedOnCompletion = false            group.fillMode = .forwards            group.repeatCount = MAXFLOAT                        layer.add(group, forKey: "RotateAnimation")            layerArray.append(layer)        }    }复制代码

2.第二个

核心代码

override init(frame: CGRect) {        super.init(frame: frame)        width = frame.size.width        height = frame.size.height                layer.backgroundColor = configure.outBackgroundColor.cgColor        layer.mask = shapeLayer(lineWidth: configure.outLineWidth, start: 0, end: 1)        animationLayer.frame = layer.bounds        animationLayer.backgroundColor = configure.inBackgroundColor.cgColor        animationLayer.mask = shapeLayer(lineWidth: configure.inLineWidth, start: configure.strokeStart, end: configure.strokeEnd)        layer.addSublayer(animationLayer)        rotationAnimation.fromValue = 0        rotationAnimation.toValue = Double.pi * 2        rotationAnimation.repeatCount = MAXFLOAT        rotationAnimation.duration = configure.duration        rotationAnimation.isRemovedOnCompletion = false        rotationAnimation.fillMode = .forwards        rotationAnimation.timingFunction = CAMediaTimingFunction(name: .linear)    }复制代码

3.总结

核心代码已经贴出,完整代码请查看Demo,为了方便大家学习,这里提供了OC和Swift两种语言分别实现的----->>>,如果对你有所帮助,欢迎Star。

转载地址:http://hnqwa.baihongyu.com/

你可能感兴趣的文章
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>
水平添加滚动条
查看>>
PHP中”单例模式“实例讲解
查看>>
VM EBS R12迁移,启动APTier . AutoConfig错误
查看>>
atitit.细节决定成败的适合情形与缺点
查看>>