我有一个允许用户绘制图像的应用程序,以便最终将其裁剪为绘制的路径。不幸的是,尽管它非常慢。原因是它依赖[self setNeedsDisplay]
来刷新UIBezierPath,这也会导致图像重绘,从而影响性能。有没有一种方法可以实现此功能而无需在每次调用setNeedsDisplay
时重绘UIImage?还是实现整个过程的更好方法?感谢所有帮助!下面是我的UIView子类:
#import "DrawView.h"
@implementation DrawView
{
UIBezierPath *path;
}
- (id)initWithCoder:(NSCoder *)aDecoder // (1)
{
if (self = [super initWithCoder:aDecoder])
{
[self setMultipleTouchEnabled:NO]; // (2)
[self setBackgroundColor:[UIColor whiteColor]];
path = [UIBezierPath bezierPath];
[path setLineWidth:2.0];
}
return self;
}
- (void)drawRect:(CGRect)rect // (5)
{
[self.EditImage drawInRect:self.bounds];
[[UIColor blackColor] setStroke];
[path stroke];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint p = [touch locationInView:self];
[path moveToPoint:p];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint p = [touch locationInView:self];
[path addLineToPoint:p]; // (4)
[self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self touchesMoved:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[self touchesEnded:touches withEvent:event];
}
@end
最佳答案
我在一个应用程序中也遇到了这个问题-正如您提到的那样,它正在调用drawInRect
导致性能问题。我解决该问题的方法是将背景图像视图和需要多次重绘的视图分离到自己的类中。
因此,在这种情况下,您将创建一个代表背景图像的类,然后将“drawView”添加到具有透明背景的视图中。这样,所有图形都将由drawView处理,但背景图像将保持静态。一旦用户完成绘制,背景视图便可以根据drawView提供的路径进行裁剪。
关于ios - UIView子类重绘UIBezierPath而不重绘整个 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32570738/