Objective c 在自定义上下文上绘制

Objective c 在自定义上下文上绘制,objective-c,ios,drawing,core-graphics,graphicscontext,Objective C,Ios,Drawing,Core Graphics,Graphicscontext,我实际上是想在视图上画线。为了在每次画画之前不清除上下文,我明白我必须创建自己的上下文才能在上面画画 我找到了创建上下文的方法: CGContextRef MyCreateBitmapContext (int pixelsWide, int pixelsHigh) { CGContextRef context = NULL; CGColorSpaceRef colorSpace; void *

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

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

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的ClearContextBeforeDrawing设置为NO

当我缩放(isAuthorizeDrawing设置为“是”以正确缩放所有线条)时,线条不会消失,但当我尝试绘制新线时(isAuthorizeDrawing设置为“否”以在每次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];
}
-(void)drawInContext:(CGContextRef)上下文{
对于(int i=0;i
您的上下文为您保留了所有图形

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

当你在你的上下文中绘制时,假设你没有做任何事情在使用之间删除它,你在其中绘制的所有东西都会堆积起来

由此产生的一个后果是,您需要注意图形状态,如当前变换矩阵、剪裁路径等,因为在绘制任务之间没有任何东西会重置这些参数。这可能是有用的,取决于你在做什么,但不管怎样,你都需要意识到这一点并相应地计划

大概您希望向用户显示您一直以来所绘制的内容(即,当
drawRect:
发生时)。去做那件事,然后进入


或者,只需要,根本不需要管理自己的位图上下文。

您的上下文为您保存所有图形

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

当你在你的上下文中绘制时,假设你没有做任何事情在使用之间删除它,你在其中绘制的所有东西都会堆积起来

由此产生的一个后果是,您需要注意图形状态,如当前变换矩阵、剪裁路径等,因为在绘制任务之间没有任何东西会重置这些参数。这可能是有用的,取决于你在做什么,但不管怎样,你都需要意识到这一点并相应地计划

大概您希望向用户显示您一直以来所绘制的内容(即,当
drawRect:
发生时)。去做那件事,然后进入


或者,只需要,根本不需要管理自己的位图上下文。

我用第一段代码编辑了我的问题,但有点问题,你能帮我吗?@Seb:你正在将上下文的内容捕获到一个图像中,然后将该图像重新绘制到相同的上下文中。最多,这将给一切一个双重打击的外观,我不认为这是你想要的;假设您只想向已经绘制的内容添加新内容,则不需要从上下文创建图像。那张过去的画已经在那里了(这就是CreateImage一开始就可以捕获它的方式)。我不确定是否完全理解。没有必要在上下文本身中绘制当前上下文的图像,好的。那么,我该怎么办?我希望找到一个解决方案,不必重新绘制所有内容(因此不要在每次setNeedsDisplay调用时调用[self-DrawInText:context和rect:rect]当我画新线时。@Seb:将
ClearContextBeforeDrawing
设置为
NO
应该足以让你保留以前的画,只需要在上面画新的东西。Hoser:我已经将
ClearContextBeforeDrawing
设置为
NO
,当我画新线时,来自服务器的线路消失了…:/我用第一段代码编辑了我的问题,但出了点问题,你能帮我吗?@Seb:你正在将上下文的内容捕获到一个图像中,然后将该图像重新绘制到相同的上下文中。最多,这将给一切一个双重打击的外观,我不认为这是你想要的;假设您只想向已经绘制的内容添加新内容,则不需要从上下文创建图像。那张过去的画已经在那里了(这就是CreateImage一开始就可以捕获它的方式)。我不确定是否完全理解。没有必要在上下文本身中绘制当前上下文的图像,好的。那么,我知道了什么