清楚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]; } 

任何人都可以告诉我为什么这不起作用,我应该做什么呢?

重新初始化路径变量并强制视图使用此新创建的空路径进行绘制。 这给人以擦除先前绘制路径的印象。 在你的子类中包含这个函数,

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

在子类的.h文件中声明此方法。 从视图控制器类中,您需要在需要擦除视图时调用此方法,

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

试试看。

希望有所帮助!

IT肯定会有效……保证…除了@Amar的回答和@Josue的评论… thanx给你们两个

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