CGPath不可见

时间:2012-03-03 07:33:17

标签: iphone cgcontext

我想在概览视角中创建一个看起来像一条线索的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 个答案:

答案 0 :(得分:1)

框架确保在-drawRect:中已经为您设置了适当的图形上下文并指向了显示设备。如果您要设置渲染其他地方(例如图片),则只需UIGraphicsBeginImageContext() / UIGraphicsEndImageContext()

删除这些电话,事情会好得多。现在,您正在渲染到屏幕外缓冲区,而不是渲染到视图本身。

修改:但是,您应该在代码周围添加一对CGContextSaveGState() / CGContextRestoreGState()次来电。如果您以某种方式使用-drawRect:,这将确保您不会污染其他图形代码的图形上下文。

编辑2:好的,我发现您在上次回复后已经解决了问题,但为了档案的利益,我要指出您永远不会直接致电-drawRect:(除了一些不起眼的案例)这里不适用)。由于您直接调用它,因此没有设置图形上下文,因此崩溃。触发重绘的正确方法是发送视图-setNeedsDisplay;这将导致框架设置图形上下文并在运行循环中的适当时间为您调用-drawRect:

答案 1 :(得分:1)

如果在iOS上,请使用UIBezierPath切换到bezier路径。肯定会工作。 另外,我注意到,你的每个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。