我正在使用EFCircularSlider显示一条圆线,用户将按以下方式移动处理程序:

ios - 为什么CGContext没有画画呢?-LMLPHP

除在动画行为中显示红线外,我已经完成了所有用户要求。我不能太多更改代码。我正在尝试逐渐画出这条弧线。我不是使用动画,而是使用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

但是,绘图将在循环完成后出现。我想使其逐渐出现。我很感谢任何人都可以在这里添加他们的经验。

我还补充说:

最佳答案

在事件循环结束时(返回drawRect之后),上下文中的所有内容都将组成屏幕。在事件循环结束之前,您只需要修改上下文,而不是屏幕。 setNeedsDisplay所做的所有事情都是说“下次事件循环运行时,需要再次绘制此视图”。它实际上并没有画任何东西。

您的方法行不通。如果要在主线程(或通常是任何线程)上调用sleepForTimeInterval:,则绝对是错误地解决了该问题。在iOS上,如果您这样做时间太长,操作系统将终止您的应用程序。

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

简短的版本是,您应该将自己的draw语句转换为对UIBezierPathCGPath的调用以绘制整个弧,然后使用CABasicAnimation对其进行动画处理。

关于ios - 为什么CGContext没有画画呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39349723/

10-12 03:31