我真的在使用Quartz2D超过10天了,请帮助我理解一些概念,我将非常感激,请查看此代码和截图网址。
此代码使用边框绘制图像并向其写入文本,图像将成为带边框和文本的全新图像。
//part 1
CGSize cgs = CGSizeMake(250.0, 400.0);
UIGraphicsBeginImageContext(cgs);
CGRect rectangle = CGRectMake(0,0,cgs.width,cgs.height);
CGRect imageRect = CGRectInset(rectangle, 5.4, 5.4);
imageRect.size.height -= 100;
UIImage *myImage = [UIImage imageNamed:@"BMW.jpg"];
[myImage drawInRect:imageRect];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 10.0);
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 1.0, 1.0);
CGContextStrokeRect(context, rectangle);
//
//part 2
1. CGRect contextRect = rectangle;
2. CGContextTranslateCTM(context, 0, contextRect.size.height);
3. CGContextScaleCTM(context, 1, -1);
4. float w, h;
5. w = contextRect.size.width;
6. h = contextRect.size.height;
7. CGContextSelectFont (context, "Helvetica-Bold", 25,
kCGEncodingMacRoman);
8. CGContextSetCharacterSpacing (context, 5);
9. CGContextSetRGBFillColor(context, 0.0, 1.0, 1.0, 1.0);
10. CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
11. CGContextShowTextAtPoint(context, 45, 50, "Quartz 2D", 9);
//
//part 3
UIImage *testImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[testImg drawAtPoint:CGPointMake(35, 10)];
//
http://i40.tinypic.com/140aptv.png
代码的第1部分和第3部分对我来说非常清楚
问题与第2部分有关
第2行和第3行的坐标被转换,因此不显示文本 颠倒了,但是uiimage已经在内部处理这个问题,为什么呢 没有转变为颠倒?为什么它仍然在显示 转换后的正确位置使用相同的文本 背景?我问这个是因为当uiimage坐标已经存在时 修改然后这个坐标变换不会再次使用uiimage 倒过来了?
在第9行和第10行上调用fillcolor和strokecolor方法 fillcolor改变文本颜色,但strokecolor没有做任何事情 发短信的原因?为什么没有CGContextSaveGState它修改了 文字颜色不是边框颜色?关于我上面提到的这两点,常见的困惑是 为什么它完美地工作为什么这个代码不需要 CGContextSaveGState和CGContextRestoreGState。怎么可能 该上下文被修改,并没有影响以前的绘图 在这种情况下像蓝色边框的项目和坐标转换 文本。
如果我没有任何方式让你明白我的观点,请纠正我。
提前致谢, 问候。
答案 0 :(得分:0)
Quartz 2D使用“画家的模型”。这意味着,你画了一件事,就完成了。然后你绘制另一个东西,它继续你之前绘制的东西。然后你绘制另一个东西,然后在顶部,等等。如果我拿起一个邮票,将它浸在油漆中并将其按到纸上,然后把它翻过来再做一遍纸的另一部分,第一个标记的图像没有因为我翻了一下邮票而翻转过来。
每次看到“笔画”或“画画”时,都会修改最终图像。后来对上下文的更改不会影响到这一点。