我正在为iOS实现自定义循环进度条。在我的drawRect方法中,我有以下代码:
override func drawRect(rect: CGRect) {
// Drawing code
let path = UIBezierPath(arcCenter: barCenter, radius: radius, startAngle: CGFloat(0.0), endAngle: CGFloat(2 * M_PI) * progress, clockwise: true)
color.set()
path.lineWidth = lineWidth
path.stroke()
}
每次进度属性改变时,我都会调用setNeedsDisplay()方法。
我想要为这个进度变化设置动画,即我不希望视图从0跳到100.我能想到的唯一方法就是使用NSTimer。那么可能有更合适的方法吗?
答案 0 :(得分:1)
我会推荐一种不同的方法。不要覆盖drawRect,而是让自定义视图在形状图层中创建CAShapeLayer和完整的圆形路径(创建圆形路径就像您在代码中所做的一样。)
然后创建一个CABasicAnimation,在您想要的任何时间段内,将形状图层的strokeEnd属性从0(不绘制路径)设置为1.0(绘制所有路径)。然后系统负责生成与屏幕刷新同步的中间帧。
您可以选择线性时序,轻松进入,轻松进入或轻松进入时间。
我在Github上有一个项目非常相似:
https://github.com/DuncanMC/iOS-CAAnimation-group-demo
看看"时钟擦除动画"演示的一部分。那个动画看起来像这样:
在该动画中,它使用形状图层作为图像视图的蒙版。您可以将形状图层安装为查看内容图层的子图层(或者您可以覆盖视图类' layerClass
方法,将自定义视图的图层类型更改为a CAShapeLayer
如果您想在视图中绘制的唯一内容是圆形动画。)
我的动画也使圆圈变得很厚,以至于它完全填满了图像的边界矩形。您想要在动画中使用较小的线条粗细。
我看到你在Swift工作了。我的示例应用程序是在Objective-C中,但概念是相同的。如果您需要帮助翻译任何内容,请告诉我。 (我' m"双语"。)