Question

I'm trying to clear the content of what I have drawn when i press a button. But, I cant seem to do it figure out how to do it. I have google around abit and it seems like you need to do this inside of draw rect. This is the full code that I am using:

#import "PaintView.h"

@implementation PaintView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        hue = 0.0;
        [self initContext:frame.size];
    }
    return self;
}

- (BOOL) initContext:(CGSize)size {

    int bitmapByteCount;
    int bitmapBytesPerRow;

    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.
    bitmapBytesPerRow = (size.width * 4);
    bitmapByteCount = (bitmapBytesPerRow * size.height);

    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.
    self.cacheBitmap = malloc( bitmapByteCount );
    if (self.cacheBitmap == NULL){
        return NO;
    }
    self.cacheContext = CGBitmapContextCreate (self.cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst);
    return YES;
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    [self drawToCache:touch];
}

- (void) drawToCache:(UITouch*)touch {
    hue += 0.005;
    if(hue > 1.0) hue = 0.0;
    UIColor *color = [UIColor colorWithHue:hue saturation:0.7 brightness:1.0 alpha:1.0];

    CGContextSetStrokeColorWithColor(self.cacheContext, [color CGColor]);
    CGContextSetLineCap(self.cacheContext, kCGLineCapRound);
    CGContextSetLineWidth(self.cacheContext, 6);

    CGPoint lastPoint = [touch previousLocationInView:self];
    CGPoint newPoint = [touch locationInView:self];

    CGContextMoveToPoint(self.cacheContext, lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(self.cacheContext, newPoint.x, newPoint.y);
    CGContextStrokePath(self.cacheContext);

    CGRect dirtyPoint1 = CGRectMake(lastPoint.x-10, lastPoint.y-10, 20, 20);
    CGRect dirtyPoint2 = CGRectMake(newPoint.x-10, newPoint.y-10, 20, 20);
    [self setNeedsDisplayInRect:CGRectUnion(dirtyPoint1, dirtyPoint2)];
}

-(void)clear{
// this doesn't work.
    CGContextClearRect(self.context, self.bounds);
}

- (void) drawRect:(CGRect)rect {
    self.context = UIGraphicsGetCurrentContext();
    CGImageRef cacheImage = CGBitmapContextCreateImage(self.cacheContext);
    CGContextDrawImage(self.context, self.bounds, cacheImage);
    CGImageRelease(cacheImage);
    CGContextRetain(self.context);
}

@end
Was it helpful?

Solution

the button should call the view's setNeedsDisplay method which forces drawrect to be called or essentially forces a repaint.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top