我使用EFCircularSlider显示圆形线,用户将移动处理程序如下:
除了在动画行为中显示红线外,我已完成所有用户要求。我无法改变我的代码。我试图逐渐绘制这条弧线。我没有使用动画来使用CGContext并在循环中显示圆圈。但它是在循环结束时绘制图像。我已将其追踪并确保循环正确调用,如下所示:
我正在调用方法:
int tmp = self.angleFromNorth;
while (tmp<360) {
NSLog(@"tmp == %d",tmp);
tmp+=10;
[NSThread sleepForTimeInterval: 0.1];
[EFCircularTrig drawUnfilledArcInContext:ctx
center:self.centerPoint
radius:self.radius
lineWidth:self.lineWidth
fromAngleFromNorth:self.angleFromNorth
toAngleFromNorth:tmp];
[self setNeedsDisplay];
}
然后它将正确打印该行,但仅在循环结束后才打印。打印出所有值时,它将显示该行。但我想让它与动画类似。
+(void) drawUnfilledArcInContext:(CGContextRef)ctx
center:(CGPoint)center
radius:(CGFloat)radius
lineWidth:(CGFloat)lineWidth
fromAngleFromNorth:(CGFloat)fromAngleFromNorth
toAngleFromNorth:(CGFloat)toAngleFromNorth
{
float cartesianFromAngle = CompassToCartesian(ToRad(fromAngleFromNorth));
float cartesianToAngle = CompassToCartesian(ToRad(toAngleFromNorth));
CGContextAddArc(ctx,
center.x, // arc start point x
center.y, // arc start point y
radius, // arc radius from center
cartesianFromAngle, cartesianToAngle,
0); // iOS flips the y coordinate so anti-clockwise (specified here by 0) becomes clockwise (desired)!
CGContextSetLineWidth(ctx, lineWidth);
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextSetShadowWithColor(ctx, CGSizeMake(0,0), 1, [UIColor colorWithRed:(0/255.0) green:(173/255.0) blue:(238/255.0) alpha:1.0].CGColor);
CGContextDrawPath(ctx, kCGPathStroke);
NSLog(@"HERE");
}
输出:
2016-09-06 22:52:48.950 EFCircularSlider[38301:288182] tmp == 22
2016-09-06 22:52:49.056 EFCircularSlider[38301:288182] HERE
2016-09-06 22:52:49.056 EFCircularSlider[38301:288182] tmp == 32
2016-09-06 22:52:49.161 EFCircularSlider[38301:288182] HERE
2016-09-06 22:52:49.162 EFCircularSlider[38301:288182] tmp == 42
2016-09-06 22:52:49.265 EFCircularSlider[38301:288182] HERE
2016-09-06 22:52:49.266 EFCircularSlider[38301:288182] tmp == 52
2016-09-06 22:52:49.371 EFCircularSlider[38301:288182] HERE
2016-09-06 22:52:49.372 EFCircularSlider[38301:288182] tmp == 62
2016-09-06 22:52:49.475 EFCircularSlider[38301:288182] HERE
2016-09-06 22:52:49.475 EFCircularSlider[38301:288182] tmp == 72
2016-09-06 22:52:49.580 EFCircularSlider[38301:288182] HERE
但是一旦循环完成,绘图就会出现。我想让它逐渐显现。如果有人可以在这里添加他们的经验,我感激不尽。
我还补充说:
答案 0 :(得分:1)
在事件循环结束时(在drawRect
返回之后),上下文中的所有内容都将组合到屏幕上。直到事件循环结束,您只是修改上下文,而不是屏幕。所有setNeedsDisplay
都会说&#34;下次事件循环运行时,需要再次绘制此视图。&#34;它本身并没有真正吸引任何东西。
你的方法无法奏效。如果您在主要主题(或通常是任何主题)上调用sleepForTimeInterval:
,则您无法正确接近问题。在iOS上,如果执行此操作的时间过长,操作系统将终止您的应用程序。
您需要为自己的路径制作动画。这通常最好通过为CAShapeLayer
设置动画来实现(strokeStart
和strokeEnd
属性可以设置动画。您将需要创建路径而不是手绘弧。这种动画有很多介绍,例如参见Ole Begemann的Animating the Drawing of a CGPath with CAShapeLayer。
简短版本是,您应该将绘制语句转换为UIBezierPath
或CGPath
上的调用以绘制整个弧,然后使用CABasicAnimation
为其设置动画。