4

我有这个代码在视图中着色:

UITouch *touch = [touches anyObject];   
    CGPoint currentPoint = [touch locationInView:drawImage];

    UIGraphicsBeginImageContext(drawImage.frame.size);
    [drawImage.image drawInRect:CGRectMake(0, 0, drawImage.frame.size.width, drawImage.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), size);

      CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), r, g, b, a);

    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

我的问题是我不想用点着色,但我想使用重复的特定图像(作为 png 图像)是否可能?

4

2 回答 2

8

加载单个 UIImage 并绘制它很容易:

UIImage *brushImage = [UIImage imageNamed:@"brush.png"];
[brushImage drawAtPoint:CGPointMake(currentPoint.x-brushImage.size.width/2, currentPoint.y-brushImage.size.height/2)];

这将在每个周期仅绘制一次图像,而不是连续的线。如果您想要画笔图片的实线,请参阅目标 C:使用 UIImage 进行描边

这可能会在每次调用此方法时最终加载图像文件,从而使其变慢。虽然结果[UIImage imageNamed:]经常被缓存,但我上面的代码可以通过存储画笔以供以后重用来改进。

说到性能,请在旧设备上进行测试。如前所述,它可以在我的第二代 iPod touch 上运行,但任何添加都可能使其在第二代和第三代设备上出现卡顿。@Armaan 推荐的Apple 的GLPaint示例使用 OpenGL 进行快速绘图,但涉及更多代码。

此外,您似乎在一个视图中进行交互(touchesBegan:, touchesMoved:, touchesEnded:),然后将其内容绘制到drawImage,大概是 a UIImageView。可以存储绘画图像,然后将此视图的图层内容设置为该图像。这不会改变性能,但代码会更干净。如果您继续使用drawImage,请通过 a 访问它,property而不是使用它的 ivar。

于 2012-04-13T10:46:09.523 回答
2

您可以从 APPLE 的示例代码开始:示例代码:GLPaint

于 2012-04-13T10:31:13.343 回答