UIView子类重绘UIBezierPath而不重绘整个视图

时间:2015-09-14 17:43:54

标签: ios objective-c uiview uibezierpath

我有一个应用程序,允许用户绘制图像,以便最终将其裁剪到绘制的路径。不幸的是,虽然很慢。原因是它依赖[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

1 个答案:

答案 0 :(得分:1)

我的一个应用程序中也存在此问题 - 正如您所提到的那样,调用drawInRect会导致性能问题。我解决它的方法是将背景图像视图和需要多次重新绘制的视图分离到它们自己的类中。

因此,在这种情况下,您将创建一个代表您的背景图像的类,然后将“drawView”添加到具有透明背景的视图中。这样,所有绘图都将由drawView处理,但背景图像将保持静态。一旦用户完成绘制,后台视图就可以根据drawView提供的路径裁剪自己。