首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGPath不可见

CGPath不可见
EN

Stack Overflow用户
提问于 2012-03-03 15:33:17
回答 2查看 901关注 0票数 0

我想创建一个CGPath,让它看起来像一条纵览透视图中的轨迹。我在UIView子类中有以下代码。我知道我是通过NSLogs输入方法的。屏幕上未显示CGPath。

代码语言:javascript
复制
- (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);
}

什么都不会提前出现谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-03 15:39:38

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

删除这些调用,事情就会变得更好。现在你正在渲染一个屏幕外的缓冲区,而不是视图本身。

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-03-05 11:17:02

如果在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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9544403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档