动画更改自定义UIView中的更改

时间:2015-11-29 21:54:41

标签: ios swift uiview

我正在为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。那么可能有更合适的方法吗?

1 个答案:

答案 0 :(得分:1)

我会推荐一种不同的方法。不要覆盖drawRect,而是让自定义视图在形状图层中创建CAShapeLayer和完整的圆形路径(创建圆形路径就像您在代码中所做的一样。)

然后创建一个CABasicAnimation,在您想要的任何时间段内,将形状图层的strokeEnd属性从0(不绘制路径)设置为1.0(绘制所有路径)。然后系统负责生成与屏幕刷新同步的中间帧。

您可以选择线性时序,轻松进入,轻松进入或轻松进入时间。

我在Github上有一个项目非常相似:

https://github.com/DuncanMC/iOS-CAAnimation-group-demo

看看"时钟擦除动画"演示的一部分。那个动画看起来像这样:

enter image description here

在该动画中,它使用形状图层作为图像视图的蒙版。您可以将形状图层安装为查看内容图层的子图层(或者您可以覆盖视图类' layerClass方法,将自定义视图的图层类型更改为a CAShapeLayer如果您想在视图中绘制的唯一内容是圆形动画。)

我的动画也使圆圈变得很厚,以至于它完全填满了图像的边界矩形。您想要在动画中使用较小的线条粗细。

编辑:

我看到你在Swift工作了。我的示例应用程序是在Objective-C中,但概念是相同的。如果您需要帮助翻译任何内容,请告诉我。 (我' m"双语"。)