我有一个带有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);
}
答案 0 :(得分:2)
首先,您不应该手动调用drawRect:
,因为当视图被重新绘制时会自动调用它。因此,如果您选择像这样手动重绘,则行为可能未定义,因为当前图形上下文可能不同或无效。以下内容摘自Apple关于drawRect:
方法的文档:
首次显示视图或发生使视图的可见部分无效的事件时,将调用此方法。你永远不应该直接调用这个方法。要使视图的一部分无效,从而导致重绘该部分,请调用setNeedsDisplay或setNeedsDisplayInRect:方法。
此外,您可能不应该在drawRect:
内启动计时器。您可能应该从其他位置启动计时器,例如代码中您首次显示此视图的位置。此外,每次重绘视图时,它都会清除之前的内容,而不是覆盖它。因此,如果您希望这是基于先前绘制的内容,则必须跟踪您绘制的每个点,并将所有重绘到当前点。您可以通过其他方式完成此操作,这些方法不会重新绘制您已绘制的内容,但会更复杂。