Objective C保留图层的上下文

时间:2013-06-13 15:48:57

标签: objective-c cgcontext

我正在使用CALayer绘制一个-(void)drawInContext:(CGContextRef)ctx形状,如下所示:

UIGraphicsPushContext(ctx);
CGContextBeginPath(ctx);
... draw path
CGContextClosePath(ctx);

CGContextClip(ctx);
CGContextSaveGState(ctx);
[self.image drawAtPoint:CGPointZero];
CGContextDrawPath(ctx, kCGPathFillStroke);  // Paint the context
CGContextRestoreGState(ctx);
UIGraphicsPopContext();

我有多个UIViews附加了这个CALayer。当特定事件发生时,我需要获取CALayer上下文绘图并将其应用于其他UIView中的其他CALayer,同时保留当前上下文绘制。我尝试从上下文缓存UImage,然后重新应用它但无济于事。

self.cachedImage = UIGraphicsGetImageFromCurrentImageContext();

我试过这个重新应用它:

self.contents = (id)self.cachedImage.CGImage;

[self.cachedImage drawAtPoint:CGPointZero];

我是非常新的,需要一些方向来保存或添加这些CALayers的上下文绘图

修改

我还在UIView而不是CALayer上尝试了此操作。这就是我所拥有的:

-(void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [self.cachedImage.image drawAtPoint:CGPointZero blendMode:kCGBlendModeNormal alpha:1.0];
    CGContextBeginPath(ctx);
    ... draw path ...
    CGContextClosePath(ctx);
    CGContextClip(ctx);
    [self.image drawAtPoint:CGPointZero blendMode:kCGBlendModeNormal alpha:1.0];
    CGContextDrawPath(ctx, kCGPathFillStroke);

    UIGraphicsBeginImageContext(self.bounds.size);
    self.cachedImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.cachedImage setAlpha:1.0];
    UIGraphicsEndImageContext();
}

这仍然清除了过去的背景图。如果我NSLog self.cachedImage.image它肯定存在。

我的一部分想知道它是否与此有关:CGContextClip()

1 个答案:

答案 0 :(得分:1)

你真的不应该在-drawRect:中设置任何东西,只能画画。您尝试做的事情应该可以在其他地方完成。根据我的理解,你试图将两个视图的绘图“合并”成一个图像?如果是这样,创建图像上下文,绘制并单独保存这些图像,在-drawRect:类似Tommy状态之外,您应该只绘制视图的状态,而不是更改对象的任何内容。 / p>

看看UIGraphicsBeginImageContext是否有一个好的起点(p.s.这也可以在后台线程上运行!)。