2013-12-18 4 views
1

У меня есть пользовательский 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]; 
}); 
} 

[само 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); 
} 

ответ

2

Во-первых, вы не должны быть вручную вызова drawRect:, потому что она вызывается автоматически, когда представление велят перерисовать. Поэтому, если вы решите перерисовать его вручную так, поведение, вероятно, не определено, потому что текущий контекст графики может отличаться или недействителен. Далее берется из документации компании Apple по методу drawRect::

Этот метод вызывается, когда вид отображается в первый раз или когда происходит событие, которое аннулирует видимую часть представления. Вы никогда не должны называть этот метод самостоятельно. Чтобы аннулировать часть вашего представления и, таким образом, заставить эту часть перерисовывать, вызовите метод setNeedsDisplay или setNeedsDisplayInRect:.

Также вы, вероятно, не должны запускать таймер, работающий с drawRect:. Вероятно, вы должны запускать свой таймер из другого места, например, где-то в вашем коде, где вы сначала показываете это представление. Также каждый раз, когда вы перерисовываете представление, оно очищает то, что ранее было там, а не накладывало его. Поэтому, если вы ожидаете, что это будет зависеть от того, что было ранее нарисовано, вы должны следить за каждой точкой, которую вы рисуете, и перерисовывать все из них до текущей точки. Вы могли бы выполнить это другими способами, которые не включали бы перерисовку того, что вы уже нарисовали, но это было бы более сложно.

Смежные вопросы