我有一个视图,当用户在iPad / iPhone屏幕上移动手指时,我会画一条虚线。我在存储为LastLocation的点和作为CurrentLocation的点之间画了一条线。图纸应保留在屏幕上。
每次触发touchMoved事件时都会发生这种情况,最终让我在用户拖动手指的地方绘制了一条虚线轨迹....就像绘画应用程序一样。
我有一个被调用的函数,在触发触摸事件时会执行以下操作。
该视图包含一个名为drawImage的UIImageView。我使用UIImageView作为持久性绘制线条的一种方式。显然,这很慢,因此人们通常不怎么绘画应用程序。
任何对使用CGContextRef调用进行持久绘画的更好方法的见识,将不胜感激。
/* Enter bitmap graphics drawing context */
UIGraphicsBeginImageContext(frame.size);
/* Draw the previous frame back in to the bitmap graphics context */
[drawImage.image drawInRect:CGRectMake(0, 0, drawImage.frame.size.width, drawImage.frame.size.height)]; //originally self.frame.size.width, self.frame.size.height)];
/* Draw the new line */
CGContextRef ctx = UIGraphicsGetCurrentContext();
/* Set line draw color to green, rounded cap end and width of 5 */
CGContextSetLineDash(ctx, 0, dashPattern, 2);
CGContextSetStrokeColorWithColor(ctx, color);
CGContextSetLineCap(ctx, kCGLineCapRound); //kCGLineCapSquare, kCGLineCapButt, kCGLineCapRound
CGContextSetLineWidth(ctx, 5.0); // for size
/* Start the new path point */
CGContextMoveToPoint(ctx, LastLocation.x, LastLocation.y);
CGContextAddLineToPoint(ctx, Current.x, Current.y);
CGContextStrokePath(ctx);
/* Push the updated graphics back to the image */
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
“ drawImage.image drawInRect”调用非常慢,并且实质上是重新绘制整个图像。
有更快的方法吗?我已经在博客上的几个地方看到过这样的绘画代码,但是画起来有点慢。
很想听听关于这个话题的一些想法。
最佳答案
无需手动合成图像和线条。具有在另一个绘制图像的UIImageView上方画线的视图。让系统进行合成并绘制图像。
在您的代码中,只需在线条绘图视图的drawRect:方法中的两条drawImage线条之间进行操作即可。
-(void) drawRect:(CGRect)dirty {
CGContextRef ctx = UIGraphicsGetCurrentContext();
/* Set line draw color to green, rounded cap end and width of 5 */
CGContextSetLineDash(ctx, 0, dashPattern, 2);
CGContextSetStrokeColorWithColor(ctx, color);
CGContextSetLineCap(ctx, kCGLineCapRound); //kCGLineCapSquare, kCGLineCapButt, kCGLineCapRound
CGContextSetLineWidth(ctx, 5.0); // for size
/* Start the new path point */
CGContextMoveToPoint(ctx, LastLocation.x, LastLocation.y);
CGContextAddLineToPoint(ctx, Current.x, Current.y);
CGContextStrokePath(ctx);
}
线的一端移动时,保存新点并将线图视图标记为需要显示。因此,Current和LastLocation都应该是线条图视图的成员,并在每个setter方法中调用setNeedsDisplay。
对于线条图视图,确保clearsContextBeforeDrawing为YES,不透明为NO。
关于iphone - 在UIImageView上绘画具有更好的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3170471/