我想在概览视角中创建一个看起来像一条线索的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);
}
什么都没有出现 提前谢谢
答案 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。