iOS:如何使用NSTimer逐步绘制圆圈

时间:2014-03-25 12:16:16

标签: ios objective-c geometry cgcontext

我想逐步绘制一个圆圈(只有圆圈的边框)(就像动画计时器一样)。 1旋转等于1天(24小时)。我真的不知道该怎么办。

我做的步骤

1)我已经尝试https://github.com/danielamitay/DACircularProgress(这是太宽泛的进展)

2)我试图绘制一个有很多弧的圆圈。

请你给我一些代码。我真的很困惑。提前致谢。

修改

我想使用NSTimer,因为我有一个允许用户停止绘制圆形的按钮。如果用户再次触摸按钮,则必须继续绘制。

2 个答案:

答案 0 :(得分:7)

我要做的是创建一个圆形路径,并将其与CAShapeLayer一起使用,并使strokeEnd设置为与I did in this answer类似的动画。

它看起来像这样(但我没有运行此代码,因此可能存在拼写错误和其他错误):

UIBezierPath *circle = [UIBezierPath bezierPathWithArcCenter:center
                                                      radius:radius
                                                  startAngle:0
                                                    endAngle:2.0*M_PI
                                                   clockwise:YES];

CAShapeLayer *circleLayer = [CAShapeLayer layer];
circleLayer.bounds = CGRectMake(0, 0, 2.0*radius, 2.0*radius);
circleLayer.path   = circle.CGPath;
circleLayer.strokeColor = [UIColor orangeColor].CGColor;
circleLayer.lineWidth   = 3.0; // your line width

CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
drawAnimation.duration = 10.0; // your duration

// Animate from no part of the stroke being drawn to the entire stroke being drawn
drawAnimation.fromValue = @0;
drawAnimation.toValue   = @1;

请注意,路径和形状图层都有一个位置,因此应相对于形状图层框架的原点定义圆形路径。首先定义形状图层然后在其边界内部创建一个椭圆形可能更清楚:

CAShapeLayer *circleLayer = [CAShapeLayer layer];
circleLayer.bounds = CGRectMake(0, 0, 2.0*radius, 2.0*radius);
circleLayer.position = center; // Set center of the circle

// Create a circle inside of the shape layers bounds
UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:circleLayer.bounds];
circleLayer.path     = circle.CGPath;

// Same appearance configuration as before
circleLayer.strokeColor = [UIColor orangeColor].CGColor;
circleLayer.lineWidth   = 3.0; // your line width

答案 1 :(得分:1)

如果DACircleProgress enter link description here对您有用,看起来您可以轻松设置线条粗细。

与具有简单的lineWidth类型属性相反,该库的作者似乎根据与圆的半径的比率来设置厚度。它作为该类的thicknessRatio属性存在。例如,如果您的半径为40,那么将thicknessRatio设置为0.025应该会产生1的线宽。该库看起来很简单且经过深思熟虑 - 考虑使用它,或者从中学习。

默认设置为0.3,因此半径为40的圆的进度线厚度为12.这可能就是您所看到的。

祝你好运!