2013-11-20 2 views
7

Я использую подкласс UIView для рисования, этот подклассовый вид используется для получения вашей подписи на контроллере представления. Существует четкая кнопка, которая должна очистить UIView, за исключением того, что она не работает. Вот что я пробовал.Очистить UIView чертежа?

subclass.h

@implementation subclassed uiview 
{ 
    UIBezierPath *path; 
    UIImage *incrementalImage; // (1) 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     [self setMultipleTouchEnabled:NO]; 
     [self setBackgroundColor:[UIColor clearColor]]; 
     path = [UIBezierPath bezierPath]; 
     [path setLineWidth:2.0]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    [incrementalImage drawInRect:rect]; // (3) 
    [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]; 
    [self setNeedsDisplay]; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event // (2) 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint p = [touch locationInView:self]; 
    [path addLineToPoint:p]; 
    [self drawBitmap]; // (3) 
    [self setNeedsDisplay]; 
    [path removeAllPoints]; //(4) 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self touchesEnded:touches withEvent:event]; 
} 

- (void)drawBitmap // (3) 
{ 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0); 
    //[[UIColor blackColor] setStroke]; 
    if (!incrementalImage) { // first draw; 
     UIBezierPath *rectpath = [UIBezierPath bezierPathWithRect:self.bounds]; // enclosing bitmap by a rectangle defined by another UIBezierPath object 
     [[UIColor clearColor] setFill]; 
     [rectpath fill]; // fill it 
    } 
    [incrementalImage drawAtPoint:CGPointZero]; 
    [path stroke]; 
    incrementalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

@end 

вид controller.m

- (IBAction)clearTapped:(id)sender { 
    self.subclassedView.backgroundColor = [UIColor clearColor]; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor); 
    CGContextFillRect(context,self.subclassedView.bounds); 
    CGContextClearRect(context, self.subclassedView.bounds); 
    CGContextFlush(context); 
    [self.subclassedView setNeedsDisplay]; 
} 

Может кто-нибудь сказать мне, почему это не работает, и что я должен делать вместо этого?

ответ

15

Повторно инициализируйте переменную пути и заставляйте вид рисовать с помощью этого вновь созданного пустого пути. Это создает впечатление стирания предыдущего нарисованного пути. В подклассе включить эту функцию,

- (void)erase { 
    path = nil; //Set current path nil 
    path = [UIBezierPath bezierPath]; //Create new path 
    [self setNeedsDisplay]; 
} 

Declare этот метод в .h файле подкласса. С вашего класса контроллера класса вам необходимо вызвать этот метод, когда вам нужно удалить этот вид,

- (IBAction)clearTapped:(id)sender { 
    [self.subclassedView erase]; 
} 

Попробуйте его.

Надеюсь, что это поможет!

+1

К сожалению, это не работает по какой-то причине. –

+1

@JosueEspinosa Этот код из моего рабочего проекта. Можете ли вы рассказать мне, что происходит в вашем случае? – Amar

+1

В итоге я просто установил свой инкрементный образ на ноль под методом стирания, который сработал! Не знаю, почему он не работал с вашим приведенным выше примером. –

4

IT, безусловно, работать .. гарантировано ... дополнение ответить на @Amar и комментарии по @Josue ... спасибо вам и

- (void)erase { 
     path = nil; //Set current path nil 
     path = [UIBezierPath bezierPath]; //Create new path 
     incrementalImage = nil; 

     [self setNeedsDisplay]; 
    } 
Смежные вопросы