CGPath не виден - PullRequest
       16

CGPath не виден

0 голосов
/ 03 марта 2012

Я хочу создать CGPath, чтобы он выглядел как след в обзорной перспективе. У меня есть следующий код в подклассе UIView. Я знаю, что я вхожу в методы через NSLogs. CGPath не появляется на экране.

- (void)drawRect:(CGRect)rect{
  CGMutablePathRef p = CGPathCreateMutable();
  CGPathMoveToPoint( p, NULL , 150 , 150 );
  CGPathMoveToPoint( p, NULL , 300 , 300 );
  CGPathMoveToPoint( p, NULL , 100 , 150 ) ;
  CGPathMoveToPoint( p, NULL , 150 , 150 );
  CGPathAddLineToPoint( p, NULL , 300 , 300 );
  CGPathAddLineToPoint( p, NULL , 100 , 150 ) ;
  CGPathAddLineToPoint( p, NULL , 150 , 150 );

  CGPathCloseSubpath( p ) ;

  CGContextRef context=UIGraphicsGetCurrentContext(); 
  CGContextBeginPath(context);
  CGContextAddPath ( context, p ) ;
  CGContextSaveGState(context); 

  CGColorRef redColor = [UIColor colorWithRed:1.0 green:12.0 blue:0.0 alpha:0.0].CGColor;
  CGContextSetFillColorWithColor(context, redColor);
  CGContextSetLineWidth(context, 20.0);
  CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);

  CGContextStrokePath(context);
  CGContextFillPath ( context ) ;

  CGContextDrawPath(context, kCGPathFill);
  CGContextRestoreGState(context);
}

Ничего не появляется Заранее спасибо

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Если на iOS, переключитесь на более безопасные пути, используя UIBezierPath.Конечно огонь на работу.Кроме того, я заметил, что каждый из ваших moveToPoints находится в одной строке, когда они должны иметь один addLineToPoint сразу после них, например так:

CGPathMoveToPoint (p, NULL, 150, 150);CGPathAddLineToPoint (p, NULL, 300, 300);

CGPathMoveToPoint (p, NULL, 300, 300; CGPathAddLineToPoint (p, NULL, 100, 150);

CGPathMoveToPoint (p, NULL, 100, 150); CGPathAddLineToPoint (p, NULL,100, 150);

CGPathMoveToPoint (p, NULL, 150, 150); CGPathAddLineToPoint (p, NULL, 150, 150);

Но вы захотите переключиться наUIBezierPaths в любом случае, как только вы увидите, насколько они просты.

1 голос
/ 03 марта 2012

Фреймворки гарантируют, что в -drawRect: уже есть соответствующий графический контекст, настроенный для вас и направленный на устройство отображения.Вам нужно только UIGraphicsBeginImageContext() / UIGraphicsEndImageContext(), если вы настраиваете рендеринг в другом месте, например, в изображение.

Удалите эти вызовы, и все будет вести себя намного лучше.Прямо сейчас вы выполняете рендеринг в внеэкранный буфер, а не в само представление.

Редактировать: Однако вы должны добавить пару вызовов CGContextSaveGState() / CGContextRestoreGState() вокруг вашего кода.Это гарантирует, что вы не загрязните графический контекст для другого графического кода, если ваш -drawRect: используется определенным образом.

Редактировать 2: Хорошо, я вижу, что вы решили проблему после вашего последнего ответа,но в интересах архивов я хочу отметить, что вы никогда не звоните -drawRect: напрямую (за исключением некоторых неясных случаев, которые здесь не применяются).Поскольку вы вызвали его напрямую, графический контекст не был настроен, следовательно, произошел сбой.Правильный способ вызвать перерисовку - отправить представление -setNeedsDisplay;это заставит фреймворки настроить графический контекст и вызвать для вас -drawRect: в соответствующее время в цикле выполнения.

...