gpt4 book ai didi

objective-c - 绘制前不要清除上下文

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:57 24 4
gpt4 key购买 nike

我正在尝试找到一种在 View 上绘制线条而不重绘所有上下文的方法。

这是我的绘图方法:

-(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];
}

但是当我在我的 touches 方法中调用 setNeedsDisplay 时, View 被完全清除。有没有办法让我的方法奏效?

最佳答案

无论好坏,我都使用图层:

- (void)drawRect:(CGRect)rect {

CGContextRef context = UIGraphicsGetCurrentContext();

if (first) {

// Wait for the first call to get a valid context

first = NO;

// Then create a CGContextRef (offlineContext_1) and matching CGLayer (layer_1)

layer_1 = CGLayerCreateWithContext (context,self.bounds.size, NULL);
offlineContext_1 = CGLayerGetContext (layer_1);

// If you have any pending graphics to draw, draw them now on offlineContext_1

}

// Normally graphics calls are made here, but the use of an "offline" context means the graphics calls can be made any time.

CGContextSaveGState(context);

// Write whatever is in offlineContext_1 to the UIView's context

CGContextDrawLayerAtPoint (context, CGPointZero, layer_1);
CGContextRestoreGState(context);

}

想法是,虽然 UIView 的上下文总是被清除,但与层关联的离线上下文却没有。您可以继续累积图形操作,而不是让它们被 drawRect 清除。

编辑:所以你已经指出了你的问题和我解决的问题之间的一个区别。在第一次显示之前我不需要绘制任何东西,而你想在第一次显示之前绘制一些东西。根据我的内存,您可以随时以任何大小和分辨率创建图层。我发现最简单的方法是等待一个有效的上下文(具有当前设备的正确设置)传递给我,然后基于该上下文创建一个新的上下文/层。查看“if (first)” block 的内部。

您可以做同样的事情,但您还必须缓存从服务器获取的行等,直到调用第一个 drawRect: 时为止。然后,您可以使用给定的上下文创建离线上下文,绘制从服务器到离线上下文的线条等,然后绘制图层,如下所示。因此,您唯一要添加到该方法的是在“if (first)”循环内调用以在继续之前绘制挂起的服务器源图形(请参阅源代码中添加的注释)。

关于objective-c - 绘制前不要清除上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13828633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com