Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CGPath不可见_Iphone_Cgcontext - Fatal编程技术网

Iphone CGPath不可见

Iphone CGPath不可见,iphone,cgcontext,Iphone,Cgcontext,我想创建一个CGPath,使其在概览透视图中看起来像一条轨迹。我在UIView子类中有以下代码。我知道我是通过NSLogs输入方法的。CGPath不会出现在屏幕上 - (void)drawRect:(CGRect)rect{ CGMutablePathRef p = CGPathCreateMutable(); CGPathMoveToPoint( p, NULL , 150 , 150 ); CGPathMoveToPoint( p, NULL , 300 , 300 ); C

我想创建一个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);
}
什么也没出现
提前感谢

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

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

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


编辑2:好的,我看到您在上次回复后已经解决了这个问题,但是为了存档的利益,我要指出,您从未直接调用
-drawRect:
(除了一些不适用于此处的模糊情况)。因为您直接调用了它,所以没有设置任何图形上下文,因此发生了崩溃。触发重画的正确方法是发送视图
-setNeedsDisplay
;这将导致框架设置图形上下文,并在运行循环中的适当时间为您调用
-drawRect:

如果在iOS上,请使用UIBezierPath切换到bezier路径。当然可以。 另外,我注意到,每个MoveTopoint都在一行中,而它们后面应该有一个addLineToPoint,如下所示:

CGPathMoveToPoint(p,NULL,150150); CGPathAddLineToPoint(p,NULL,300300)

CGPathMoveToPoint(p,NULL,300300; CGPathAddLineToPoint(p,NULL,100150)

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

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


但一旦你看到UIBezierPath有多简单,你还是会想切换到UIBezierPath。

我更新了我的代码,但仍然没有显示任何内容。我有一个ViewController,如果它有任何意义的话。我得到一个错误:CGContextBeginPath:invalid context 0x0什么?我不知道context怎么可能为零。你有可能调用-drawRect:你自己吗?我发现了。感谢您的帮助。非常感谢。太好了。请查看我的编辑,以确保这是您发现的最终问题。(如果我的回答在调试中起到决定性作用,您也可以接受。;-)我如何在drawRect方法之外创建CGPath等。我假设我必须创建一个上下文来渲染图像。但是该方法看起来会是什么样的呢?虽然我不怀疑UIBezierPath在可用时是一个很好的快捷方式(并且假设您没有编写跨平台的绘图代码),对于史蒂文来说,UIBezierPath同样会失败,因为我刚才在自己的回答中概述了更大的原因。不过,在切入点的过程中,很好地抓住了重点……这会导致画画失败,但不会遗漏。哦,我明白你的意思了。谢谢你指出这一点!我每天都在这里学到新的东西:D