在自定义UIView中绘制圆圈

时间:2013-12-18 18:33:22

标签: ios uiview

我有一个带有drawRect的自定义UIView:

-(void)drawRect:(CGRect)rect{

CGContextRef context = UIGraphicsGetCurrentContext();
[self drawControlPointsWithCoordsX:point.x andY:point.y forRect:CGRectMake(0, 0, 320, 600) andContext:context];
NSLog(@"Values: %f and %f", point.x, point.y);

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    [self  startTimer];
});
}

[self startTimer];是启动方法。在这个方法中,我启动一个计时器,它产生一些纵坐标。它只被调用一次。坐标以这种形式出现:

值:276.711670和117.279999

并不断变化。记录所有值。在每0.1秒由计时器重复的方法中,我调用:

[self drawRect:CGRectMake(0, 0, 320, 600)];

日志有效,坐标也在不断变化,并且是正确的,但只绘制了两个或三个点(而不是或多或少400个)并且它们位于错误的位置。

这是绘制点的代码:

- (void)drawControlPointsWithCoordsX:(int)x andY:(int)y forRect:(CGRect)rect andContext:(CGContextRef)contextRef
{
UIGraphicsPushContext(contextRef);
CGContextSetLineWidth(contextRef, 2.0);
CGContextSetRGBFillColor(contextRef, 0, 0, 1.0, 1.0);
CGContextSetRGBStrokeColor(contextRef, 0, 0, 1.0, 1.0);
CGRect circlePoint = (CGRectMake(x,y, 5.0, 5.0));

CGContextFillEllipseInRect(contextRef, circlePoint);
}

1 个答案:

答案 0 :(得分:2)

首先,您不应该手动调用drawRect:,因为当视图被重新绘制时会自动调用它。因此,如果您选择像这样手动重绘,则行为可能未定义,因为当前图形上下文可能不同或无效。以下内容摘自Apple关于drawRect:方法的文档:

  

首次显示视图或发生使视图的可见部分无效的事件时,将调用此方法。你永远不应该直接调用这个方法。要使视图的一部分无效,从而导致重绘该部分,请调用setNeedsDisplay或setNeedsDisplayInRect:方法。

此外,您可能不应该在drawRect:内启动计时器。您可能应该从其他位置启动计时器,例如代码中您首次显示此视图的位置。此外,每次重绘视图时,它都会清除之前的内容,而不是覆盖它。因此,如果您希望这是基于先前绘制的内容,则必须跟踪您绘制的每个点,并将所有重绘到当前点。您可以通过其他方式完成此操作,这些方法不会重新绘制您已绘制的内容,但会更复杂。