我对iOS上的石英核心有疑问
当我使用Quartz绘制线条时,会发生以下情况,我找不到原因:
当我画第二行时,第一行会消失
当我绘制第三行时,第二行会消失,第一行和第三行会显示 .. 的
当我绘制第2n + 1行时,1,3,5,...... 2n-1行显示,而2,4,6,8 ... 2n消失
请参阅下面的代码。我不保存上下文和路径 作为我的理解,我认为它应该是两个案例中的一个
但这两种情况都没有发生。
- (void)drawInContext:(CGContextRef)context {
// 橡皮擦
//CGContextClearRect(context, CGRectMake(0, 0, 320, 480));
CGContextSetLineWidth(context, 4.0);
CGContextMoveToPoint(context, previousPoint.x, previousPoint.y);
CGContextSetRGBStrokeColor(context, 0, 1.0, 1.0, 1.0);
CGContextAddLineToPoint(context, nextPoint.x,nextPoint.y);
CGContextStrokePath(context);
//NIF_TRACE(@"began : %@ moved : %@", NSStringFromCGPoint(previousPoint),NSStringFromCGPoint(nextPoint));
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
previousPoint = [touch locationInView:self];
nextPoint = [touch locationInView:self];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
previousPoint = nextPoint;
nextPoint = [touch locationInView:self];
[self setNeedsDisplay];
}
我看到一个使用NSMutableArray来保存它绘制的所有UIBezierPaths的演示,当View重绘时,它传输保存在数组中的路径,在drawRect中恢复它们:
UIBezierPath是Objective C的包装器,它只适用于3.2+ 我需要做一些让它在3.0+以上工作的东西 我认为它必须存在一种更好的方法来保存上下文和路径(颜色,路径,strokeWidths)
有人有想法吗?
答案 0 :(得分:1)
每当你“drawInContext”时,你正在清理绘图区域并放置新的行....这个清晰的代码:
CGContextClearRect(context, CGRectMake(0, 0, 320, 480));
需要在你的代码中的某个地方......只会被激活一次(或者如果你需要清除整个绘图(可能是擦除所有功能))
答案 1 :(得分:0)
您需要将图像保存在画布上:
CGImageRef imageRef;
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
if (imageRef) {
// Restore the screen that was previously saved
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, rect, imageRef);
CGImageRelease(imageRef);
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
}
// Your drawing code here...
imageRef = CGBitmapContextCreateImage(context);
}