2015-09-14 1 views
1

У меня есть приложение, которое позволяет пользователю рисовать изображение, чтобы в конечном итоге обрезать его до пройденного пути. К сожалению, хотя это очень медленно. Причина в том, что он использует [self setNeedsDisplay], чтобы обновить UIBezierPath, что также приводит к перерисовке изображения и затрудняет работу. Есть ли способ реализовать это без перерисовки UIImage при каждом вызове setNeedsDisplay? Или лучший способ реализовать всю вещь? Вся помощь приветствуется! Ниже мой UIView подкласс:Подкласс UIView redraw UIBezierPath без перерисовки всего изображения

#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

Я имел этот вопрос, а в одном из моих приложений - как вы упомянули зовёт drawInRect, который вызывает проблемы с производительностью. Способ, которым я решил это, заключается в разделении вида фонового изображения и представления, которое нужно повторно рисовать несколько раз в свои собственные классы.

Итак, в этом случае вы создадите класс, который будет представлять фоновое изображение, а затем добавьте ваш «drawView» к этому представлению с прозрачным фоном. Таким образом, весь рисунок будет обработан drawView, но фоновое изображение останется неподвижным. Как только пользователь выполнит рисование, фоновое изображение может затем обрезать себя на основе пути, предоставленного drawView.

+0

Это сработало! Спасибо!!!! –

Смежные вопросы