gpt4 book ai didi

iphone - 在 UIImageView 上绘画具有更好的性能

转载 作者:行者123 更新时间:2023-12-03 21:22:50 24 4
gpt4 key购买 nike

我有一个 View ,当用户在 iPad/iPhone 屏幕上移动手指时,我会在其中绘制一条虚线。我在存储为 LastLocation 的点和 CurrentLocation 点之间画了一条线。绘图应持久显示在屏幕上。每次触发 touchMoved 事件时都会发生这种情况,最终让我在人们拖动手指的地方画一条虚线......就像绘画应用程序一样。

我有一个被调用的函数,它在触发触摸事件时执行以下操作。该 View 包含一个名为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 上方绘制线条的 View 。让系统进行合成并绘制图像。

在您的代码中,只需在线条绘制 View 的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);
}

当线条的一端移动时,保存新点并将线条绘制 View 标记为需要显示。因此 Current 和 LastLocation 都应该是线条绘制 View 的成员,并且在每个的 setter 方法中调用 setNeedsDisplay。

确保线条绘图 View 的clearsContextBeforeDrawing为YES且opaque为NO。

关于iphone - 在 UIImageView 上绘画具有更好的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3170471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com