目标C语言 绘制自定义上下文



我实际上是在尝试在视图上绘制线条。为了在每次绘制之前不清除上下文,我明白我必须创建自己的上下文才能在其上绘制。

我找到了创建上下文的方法:

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。

当我缩放(isauthorizeddrawing设置为YES,以便重新绘制所有正确缩放的线条),线条不会消失,但当我尝试绘制新线条时(isauthorizeddrawing设置为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];
}

你的上下文为你保留了所有的绘图。

当你绘制到一个视图提供的上下文(即,在drawRect:内),要么视图每次创建一个新的上下文,要么它已经擦除了上下文的内容,就像摇动蚀刻草图。无论哪种方式,您都得到了一个上下文(至少有效地)没有绘制任何内容。

当你在上下文中绘制时,假设你没有做任何事情来删除它,那么你绘制的所有内容都会堆积起来。

这个问题的一个分支是,你需要小心绘制状态,如当前变换矩阵,剪切路径等,因为没有什么是在绘制会话之间重置这些参数。这可能是有用的,这取决于你在做什么,但无论哪种方式,你都需要意识到这一点,并相应地计划。

假设你想向用户展示你时不时画的东西(也就是说,当drawRect:发生时)。要做到这一点,请位图上下文创建其内容的图像,并将该图像绘制到当前(uikit提供的)上下文中。

或者,只是告诉视图在每次绘制之前不要清除自己,并且根本不用管理自己的位图上下文。

相关内容

  • 没有找到相关文章

最新更新