0

我正在开发一个应用程序,在某些时候用户需要在图像上绘制一些东西。我编写的代码适用于周围1500x1500和较小的图像,但是一旦图像变大,问题就开始了。

当图像变得太大时,绘制需要更多时间,并且手势识别器很少被调用。

我是这样做的:有两个类,一个是UIScrollView名为的子类,一个是名为DrawViewUIImageView子类MyPenDrawView有一个每次被识别时都会UIPanGestureRecognizer发送消息(我得到并根据它开始或移动一行)。在其子视图中有两个 UIImageView 对象,一个用于背景图像,一个用于绘图(笔)。MyPen[recognizer state]DrawView

这是我在 MyPen 中所做的:

- (void)beginLine:(CGPoint) currentPoint
{
    previousPoint = currentPoint;
}

- (void)moveLine:(CGPoint) currentPoint
{
    self.image = [self drawLineFromPoint:previousPoint toPoint:currentPoint image:self.image];
    previousPoint = currentPoint;
}

- (UIImage *)drawLineFromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint image:(UIImage *)image
{
CGSize screenSize = self.frame.size;
UIGraphicsBeginImageContext(screenSize);
CGContextRef currentContext = UIGraphicsGetCurrentContext();
[image drawInRect:CGRectMake(0, 0, screenSize.width, screenSize.height)];

CGContextSetLineCap(currentContext, kCGLineCapRound);
CGContextSetLineWidth(currentContext, _thickness);
CGContextSetStrokeColorWithColor(currentContext, _color);
CGContextBeginPath(currentContext);
CGContextMoveToPoint(currentContext, fromPoint.x, fromPoint.y);
CGContextAddLineToPoint(currentContext, toPoint.x, toPoint.y);
CGContextStrokePath(currentContext);

UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return ret;
}

当图像足够大时,CoreGraphics 需要一些时间来渲染它,因此手势识别器不会经常被识别,并且向笔发送的点更少。

这里的问题是:有没有办法优化绘图?我应该为 ir 使用另一个线程吗?还有其他方法吗?非常感谢任何帮助。

4

1 回答 1

1

您应该将前景(线条)和背景(应该在其上绘制线条的图像)拆分为两个视图。所以你只能在用户每次移动手指时更新前景视图。当用户完成绘图时,您可以将两个视图组合成一个图像。

在 CGContext 中绘制图像非常昂贵,尤其是在很大的时候。

于 2012-09-12T14:06:33.347 回答