[英]CGPath not visible
我想创建一个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);
}
什么都没有出现提前谢谢
框架确保in -drawRect:
已经为您设置了适当的图形上下文并指向显示设备。 如果要设置渲染其他位置(例如图像UIGraphicsBeginImageContext()
则只需要UIGraphicsBeginImageContext()
/ UIGraphicsEndImageContext()
。
删除这些调用,事情会表现得更好。 现在,您将渲染到屏幕外缓冲区,而不是渲染到视图本身。
编辑:但是,您应该在代码周围添加一对CGContextSaveGState()
/ CGContextRestoreGState()
调用。 如果以某种方式使用-drawRect:
这将确保您不会污染其他图形代码的图形上下文。
编辑2:好的,我看到你在上一次回复后已经解决了问题,但为了档案的利益,我要指出你从不直接调用-drawRect:
除了一些不适用的模糊案例)这里)。 由于您直接调用它,因此没有设置图形上下文,因此崩溃。 触发重绘的正确方法是发送视图-setNeedsDisplay
; 这将导致框架在运行循环中的适当时间为您设置图形上下文并调用-drawRect:
如果在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有多容易,你就会想要切换到UIBezierPaths。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.