-1

透明的 有色

我有两个名为透明和彩色的图像,如上所示。我想要

  1. 首先显示透明图像
  2. 当用户触摸屏幕时,在手指抚摸上显示彩色图像。

这是我的 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();    

}

上面的代码只是创建了一个空白屏幕。我在这里做错了什么?请帮帮我。

4

2 回答 2

2

使用单个视图的drawRect方法意味着每次用户绘制某些东西时,您都需要绘制两个图像和一个贝塞尔路径。这将是非常低效的。您需要一种将图像和绘图区域存储在不同位置的方法。

CALayer 可以很好地解决这类问题。您可以将图像存储在图层中,并让用户的绘图蒙版其中一个图层。从CALayer Class Reference开始,包括示例。

对于真正流畅的绘图,您需要使用 OpenGL——尽管它需要做更多的工作才能做到正确。请参阅 Apple 的GLPaint示例。


至于为什么这段代码不起作用,它确实绘制了两个图像。但是,绘制的第二张图像将是transparentImage. 您的附件暗示这是不透明的灰色。这将使您的视图充满灰色,看起来什么都不做。如果您确定它没有画那么多,请检查以下内容:

  1. 您是否在某处构建此类的视图 - 无论是在 Interface Builder 中还是在代码中?
  2. 您是否在您知道正在显示的视图控制器的视图中添加此视图?
  3. 你给这个视图一个大小吗?新创建的视图的宽度和高度可以为零,从而使它们实际上是不可见的。
  4. 您的图像加载例程是否返回任何内容?

其中一些可以通过日志记录进行测试。例如,检查图像是否正确加载:

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");
于 2012-04-15T06:12:52.637 回答
1

您正在调用UIGraphicsEndImageContext(),但您从未调用UIGraphicsBeginImageContext(...),因此它可能正在删除默认的绘图上下文(或同样疯狂的东西)。那条线不应该在那里;这些函数用于创建您自己的UIImage,您无需在此处执行此操作。

于 2012-04-15T04:48:18.493 回答