2012-03-21 2 views
7

Я разрабатываю приложение блокировки шаблонов (например, Android lock).CGContextAddLineToPoint: нет текущей точки

Я хочу, чтобы рисовать линии между точками, чтобы открыть замок, но когда я рисую, он возвращает ошибку:

<Error>: CGContextAddLineToPoint: no current point

Он работает отлично в прошивкой 5.0 и раньше, но он показывает ошибку в 5.1.

Это мой код:

- (void)drawRect:(CGRect)rect 
{ 
NSLog(@"drawrect...%@",NSStringFromCGRect(rect)); 

if (!self._trackPointValue) 
return; 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 10.0); 
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
CGFloat components[] = {0.5, 1.0, 0.5, 0.8}; 
CGColorRef color = CGColorCreate(colorspace, components); 
CGContextSetStrokeColorWithColor(context, color); 

CGPoint from; 
UIView *lastDot; 
for (UIView *dotView in self._dotViews) { //_dotViews array of points 
from = dotView.center;  
if (!lastDot) 
{ 
    CGContextMoveToPoint(context, from.x, from.y); 

    } 
else 
{ 
    NSLog(@"from : %@",NSStringFromCGPoint(from)); 
    CGContextAddLineToPoint(context, from.x, from.y); 

} 

lastDot = dotView; 
} 

CGPoint pt = [self._trackPointValue CGPointValue]; //_trackPointValue is current point 

CGContextAddLineToPoint(context, pt.x, pt.y); 

CGContextStrokePath(context); 
CGColorSpaceRelease(colorspace); 
CGColorRelease(color); 

self._trackPointValue = nil;//_trackPointValue is current point 
} 

ответ

0

Вы должны сначала создать путь с CGContextBeginPath, прежде чем начать добавление точек и линий к нему.

+4

Неправда. CGContext всегда имеет текущий путь (возможно, пустой), к которому вы можете добавить элементы. Вам нужно 'CGContextBeginPath' только тогда, когда вы хотите отменить текущий путь и начать с нового пустого пути. –

+0

Я этого не знал, спасибо. –

2

Это:

UIView *lastDot; 

Должно быть:

UIView *lastDot = nil; 

Неинициализированные автоматические переменные являются мусором. Ваш код пытается сделать что-то особенное в первый раз через цикл, когда lastDot еще не установлен. Вам нужно явно указать его на nil.

+0

Здравствуйте, Thankyou так много я получил it.thanks для предложения – Pardhu

11

Чтобы иметь актуальную информацию, вы должны убедиться, что по крайней мере один раз CGContextMoveToPoint был вызван до CGContextAddLineToPoint в действии.

+0

случайно, есть ли что-нибудь от верхней части головы, которая вызовет этот метод, который нельзя назвать? У меня такая же проблема, но я абсолютно уверен, – d2burke

+0

@ d2burke - Убедитесь, что вы вызываете CGContextStrokePath() только после завершения строки. Если вы вызываете ее до завершения строки, вам нужно вызвать CGContextMoveToPoint () еще раз. –

0

Когда вы впервые придете, метод forin не войдет. Таким образом, используется метод «CGContextMoveToPoint()», а затем приводят к предупреждению.

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