我有两个名为Transparent and Colored的图像,如上所示。我想
这是我的drawRect代码。
- (void) drawRect:(CGRect)rect
{
[[UIColor redColor] set];
CGContextRef context1 = UIGraphicsGetCurrentContext();
UIImage *colorImage = [UIImage imageNamed:@"color.png"];
UIImage *bwImage = [UIImage imageNamed:@"transparent.png"];
CGContextSetBlendMode(context1, kCGBlendModeSourceAtop);
// Draw the finger Strokes
for (UIBezierPath *path in [touchPaths allValues]) {
[path stroke];
}
CGContextDrawImage(context1, rect, colorImage.CGImage);
CGContextDrawImage(context1, rect, bwImage.CGImage);
UIGraphicsEndImageContext();
}
上面的代码只会创建一个空白屏幕。我在这做错了什么?请帮帮我。
答案 0 :(得分:2)
在单个视图中使用drawRect
方法意味着每次用户绘制内容时,您都需要绘制两个图像和一个贝塞尔曲线路径。这将是非常低效的。您需要一种方法将图像和绘图区域存储在不同的位置。
CALayer很适合这类问题。您可以将图像存储在图层中,并将用户的绘图蒙版设置为其中一个图层。从CALayer Class Reference开始,包括示例。
对于真正流畅的绘图,你是OpenGL - 虽然需要做更多的工作才能做好。请参阅Apple的GLPaint示例。
至于为什么这段代码不起作用,它确实绘制了两个图像。但是,绘制的第二张图像将为transparentImage
。你的附件暗示这是不透明的灰色。这将使您的视图充满灰色,似乎什么都不做。如果你确定它没有那么多,请检查以下内容:
其中一些可以使用日志记录进行测试。例如,要检查图像是否正确加载:
UIImage *colorImage = [UIImage imageNamed:@"color.png"];
UIImage *bwImage = [UIImage imageNamed:@"transparent.png"];
// Check if the images loaded.
NSLog(@"colorImage = %@", colorImage);
if (!colorImage)
NSLog(@"colorImage did not load, nothing to draw");
NSLog(@"bwImage = %@", bwImage);
if (!bwImage)
NSLog(@"bwImage did not load, nothing to draw");
答案 1 :(得分:1)
您正在调用UIGraphicsEndImageContext()
,但您从未调用UIGraphicsBeginImageContext(...)
,因此它可能会删除默认的绘图上下文(或同样疯狂的内容)。那条线不应该在那里;这些功能用于创建您自己的UIImage
,您无需在此处执行此操作。