带有CALayer的动画进度加载器— Swift和Xcode
开发iOS应用程序时,通常需要从CDN中获取图像,这可能需要一些时间,具体取决于图像的大小,服务器速度和设备的网络连接。 在此获取时间内,您的UI将已经呈现,并且您想显示图像获取进度的可视指示器。 在iOS上,您具有默认的UIActivityIndicatorView
。 它可以工作,但是您可以轻松创建更具个性化的新对象。
要求
- Xcode
- Swift的知识
- Apple Swift官方文档(https://developer.apple.com/documentation/quartzcore)
- 斯威夫特游乐场
让我们深入研究代码
首先,我们需要创建装载机的形状。 对于此示例,我们需要一个循环加载器。
让我们创建跟踪图层,以显示加载程序的形状。
让trackLayer = CAShapeLayer()
trackLayer.position = CGPoint(x:50,y:50)
trackLayer.lineCap = CAShapeLayerLineCap.round
trackLayer.lineWidth = 2
trackLayer.fillColor = UIColor.clear.cgColor
trackLayer.strokeColor = UIColor(红色:80/255,绿色:80/255,蓝色:80/255,alpha:0.5).cgColor
trackLayer.anchorPoint = CGPoint(x:0.5,y:0.5)
现在已经创建了图层,我们想要定义圆形。
trackLayer.path = UIBezierPath(arcCenter:.zero,半径:10,startAngle:0,endAngle:2 * CGFloat.pi,顺时针:true).cgPath
为了显示跟踪图层,我们必须将其添加到视图中。
view.layer.addSublayer(trackLayer)
如果您在操场上跑步,您会在左上角看到一个圆形。
做得好,我们已经准备好跟踪层。 现在,我们需要创建一个新图层,该图层将与跟踪图层重叠并根据加载进度进行填充。
让shapeLayer = CAShapeLayer()
shapeLayer.position = CGPoint(x:50,y:50)
shapeLayer.lineCap = CAShapeLayerLineCap.round
shapeLayer.lineWidth = 2
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeColor = UIColor(红色:246/255,绿色:250/255,蓝色:251/255,alpha:0.9).cgColor
shapeLayer.anchorPoint = CGPoint(x:0.5,y:0.5)
shapeLayer.path = UIBezierPath(arcCenter:.zero,半径:10,startAngle:0,endAngle:2 * CGFloat.pi,顺时针:true).cgPath
view.layer.addSublayer(shapeLayer)
我们差不多完成了,只需要更改形状层的方向即可。 目前,我们的形状图层笔划从右上角开始,我们需要像常规加载程序一样从顶部中心开始画线。
shapeLayer.transform = CATransform3DMakeRotation(-CGFloat.pi / 2,0,0,1)
在将shapeLayer
添加到视图图层之前,添加此行。
瞧,我们完成了。 要为进度加载器设置动画,您需要更改图层的strokeEnd
属性。 请记住,该值必须介于0和1之间(以百分比表示)。
shapeLayer.strokeEnd = 0.5 // 50%的加载进度
如果您想在操场上看动画,您将需要做更多的工作。
首先,让我们为操场添加无限执行,否则您将无法看到任何动画,因为操场将在函数中的最后一条语句之后停止,异步代码将无法工作。
导入PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
为了模拟加载进度,我们将使用Timer
,该计时器在每个时间段将执行一段代码。 在我们的案例中,代码块更改了strokeEnd
属性。
Timer.scheduledTimer(withTimeInterval:0.2,重复:true,块:{(timer)in
shapeLayer.strokeEnd + = 0.1
如果shapeLayer.strokeEnd> 1 {
timer.invalidate()
}
})
如果您在操场上玩耍,您会在2秒钟内看到装载机动画。