【问题标题】:how to delete content of UIView (Core Graphics)?如何删除 UIView(核心图形)的内容?
【发布时间】:2014-05-01 16:18:45
【问题描述】:

当我按下按钮时,我正在尝试清除我绘制的内容。但是,我似乎无法弄清楚该怎么做。我在 abit 附近有谷歌,似乎你需要在 draw rect 中执行此操作。这是我正在使用的完整代码:

#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

【问题讨论】:

    标签: ios objective-c uiview core-graphics


    【解决方案1】:

    按钮应调用视图的 setNeedsDisplay 方法,该方法强制调用 drawrect 或实质上强制重绘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多