2016-09-06 53 views
1

我使用EFCircularSlider显示圆线和用户将移动处理程序如下:为什么CGContext没有绘制循环?

我已经完成了,除了在动画行为显示红线所有用户的需求。我无法改变我的代码。我试图逐渐画出这条弧线。我正在使用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 

但是一旦循环完成图纸会出现。我想让它逐渐显现。我很感激任何人都可以在这里添加他们的经验。

我还补充说:

回答

1

在事件循环结束(drawRect返回之后),在上下文一切都将组成到屏幕上。直到事件循环结束,你只是修改上下文,而不是屏幕。所有setNeedsDisplay确实是说“下一次事件循环运行,这个视图需要再次绘制。”它本身并没有实际绘制任何东西。

您的方法无法正常工作。如果您在主线程(或任何线程)上调用sleepForTimeInterval:,那么您确实错误地处理了该问题。在iOS上,如果你这样做的时间太长,操作系统将会终止你的应用程序。

您需要为您的路径设置动画。这通常最好通过动画CAShapeLayerstrokeStartstrokeEnd属性可以动画)来完成。您将需要创建一个路径,而不是手工绘制弧线。这种动画有很多介绍,例如见Ole Begemann的Animating the Drawing of a CGPath with CAShapeLayer

短的版本,虽然是你要你的平局语句转换成一个UIBezierPathCGPath调用绘制整个弧线,然后用CABasicAnimation动画吧。