绘制自定义上下文

时间:2012-12-24 15:02:11

标签: objective-c ios drawing core-graphics graphicscontext

我实际上是想在视图上画线。为了在每次抽奖之前不清楚上下文,我明白我必须创建自己的上下文才能使用它。

我发现这种方式来创建一个上下文:

CGContextRef MyCreateBitmapContext (int pixelsWide,
                                int pixelsHigh)
{
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;

    bitmapBytesPerRow   = (pixelsWide * 4);
    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

    colorSpace = CGColorSpaceCreateDeviceRGB();
    bitmapData = calloc( bitmapByteCount, sizeof(int) );
    if (bitmapData == NULL)
    {
        fprintf (stderr, "Memory not allocated!");
        return NULL;
    }
    context = CGBitmapContextCreate (bitmapData,
                                     pixelsWide,
                                     pixelsHigh,
                                     8,      // bits per component
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     kCGImageAlphaPremultipliedLast);
    if (context== NULL)
    {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
        return NULL;
    }
    CGColorSpaceRelease( colorSpace );

    return context;
}

但我的问题是:我怎样才能使用这个上下文,以免每次都清理我的视图?

编辑 (在@Peter Hosey回答之后)

我尝试做类似的事情:

- (void)drawRect:(CGRect)rect {
    // Creation of the custom context
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGImageRef cgImage = CGBitmapContextCreateImage(context);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), cgImage);
    CGImageRelease(cgImage);
    if (isAuthorizeDrawing) {
         [self drawInContext:context andRect:rect]; // Method which draw all the lines sent by the server
         isAuthorizeDrawing = NO;
    }

    // Draw the line
    [currentDrawing stroke];
}

我还为UIView设置了clearsContextBeforeDrawing为NO。

当我缩放(isAuthorizeDrawing设置为YES以重绘所有正确缩放的线条)时,线条不会消失但是当我尝试绘制新线条时(isAuthorizeDrawing设置为NO以便不重绘所有内容)每个setNeedsDisplay调用),所有的行都消失了,绘图真的很慢..:/

我做错了吗?

编辑2

以下是我的绘图方法:

-(void)drawInContext:(CGContextRef)context {
    for (int i = 0; i < self.drawings.count; ++i) {
        Drawing* drawing = [self.drawings objectAtIndex:i];

        CGContextSetStrokeColorWithColor(context, drawing.colorTrait.CGColor);
        CGContextSetLineWidth(context, 1.0);

        CGContextMoveToPoint(context, [[drawing.points objectAtIndex:0] CGPointValue].x * self.zoomScale, [[drawing.points objectAtIndex:] CGPointValue].y * self.zoomScale);

        for (int i = 1; i < drawing.points.count; i++) {
            CGContextAddLineToPoint(context, [[drawing.points objectAtIndex:i] CGPointValue].x * self.zoomScale, [[drawing.points objectAtIndex:i] CGPointValue].y * self.zoomScale);
        }

        CGContextStrokePath(context);
    }
}

-(void)drawRect:(CGRect)rect {
    if (isRedrawing) {
        [self drawInContext:UIGraphicsGetCurrentContext()];
        isRedrawing = NO;
    }

    [[UIColor redColor] set];
    [currentPath stroke];
}

1 个答案:

答案 0 :(得分:4)

您的上下文适用于您的所有绘图。

当你绘制一个视图提供的上下文时(即在drawRect:内),视图每次都会创建一个新的上下文,或者它已经删除了上下文的内容,比如摇动一个Etch-a -草图。无论哪种方式,你都会得到一个上下文(有效地,至少)没有被绘制出来。

当您进入 上下文时,假设您在使用之间没有做任何事情来擦除它,那么您在其中绘制的所有内容都会堆积起来。

这样做的一个分支就是你需要注意绘制状态,如当前的变换矩阵,剪切路径等,因为没有任何东西在绘图会话之间重置这些参数。这可能很有用,取决于你正在做什么,但不管怎样,你需要了解它并做出相应的计划。

据推测,您希望向用户显示您目前为止所绘制的内容(即drawRect:发生时)。为此,ask the bitmap context to create an image of its contentsdraw that image加入the current (UIKit-supplied) context

或者,只需tell the view not to clear itself before every draw,并且根本不需要管理自己的位图上下文。