我想创建一个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);
}什么都不会提前出现谢谢
发布于 2012-03-03 15:39:38
这些框架确保在-drawRect:中已经为您设置了适当的图形上下文,并指向显示设备。如果要设置渲染到其他位置,例如渲染到图像,则仅需要UIGraphicsBeginImageContext()/UIGraphicsEndImageContext()。
删除这些调用,事情就会变得更好。现在你正在渲染一个屏幕外的缓冲区,而不是视图本身。
编辑:但是,您应该在代码周围添加一对CGContextSaveGState() / CGContextRestoreGState()调用。如果您的-drawRect:以某种方式使用,这将确保您不会污染其他图形代码的图形上下文。
编辑2:好的,我看到你在最后一次回复后已经解决了这个问题,但为了存档,我要指出的是,你永远不会直接调用-drawRect: (除了在一些不适用于这里的模糊情况下)。由于您直接调用了它,因此没有设置任何图形上下文,因此发生了崩溃。触发重绘的正确方法是发送视图-setNeedsDisplay;这将导致框架设置一个图形上下文并在运行循环中的适当时间为您调用-drawRect:。
发布于 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是多么的简单,你就会想要切换到它们。
https://stackoverflow.com/questions/9544403
复制相似问题