我正在使用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()
答案 0 :(得分:1)
你真的不应该在-drawRect:
中设置任何东西,只能画画。您尝试做的事情应该可以在其他地方完成。根据我的理解,你试图将两个视图的绘图“合并”成一个图像?如果是这样,创建图像上下文,绘制并单独保存这些图像,在-drawRect:
类似Tommy状态之外,您应该只绘制视图的状态,而不是更改对象的任何内容。 / p>
看看UIGraphicsBeginImageContext
是否有一个好的起点(p.s.这也可以在后台线程上运行!)。