Objective c 在同一UIView中绘制CGContext两次

Objective c 在同一UIView中绘制CGContext两次,objective-c,uiview,core-graphics,quartz-graphics,cgcontext,Objective C,Uiview,Core Graphics,Quartz Graphics,Cgcontext,我有一个UIView子类,它带有一个自定义的drawRect:方法,该方法执行一些昂贵的计算来构建路径,并在当前上下文中使用CGContextStrokePath()来绘制路径 如果我的视图有一个大小(x,y),我想在(0,0),(x/2,y)上进行自定义绘图,然后用前半部分的镜像图像填充(x/2,0),(x,y)区域 除了手动复制要绘制的点之外,最简单/最快的方法是什么?可能将半视图渲染为位图图像上下文,并使用该视图在当前图像上下文的两个半视图上进行渲染?内容是动画的,因此drawRect:每

我有一个
UIView
子类,它带有一个自定义的
drawRect:
方法,该方法执行一些昂贵的计算来构建路径,并在当前上下文中使用
CGContextStrokePath()
来绘制路径

如果我的视图有一个大小
(x,y)
,我想在
(0,0),(x/2,y)
上进行自定义绘图,然后用前半部分的镜像图像填充
(x/2,0),(x,y)
区域


除了手动复制要绘制的点之外,最简单/最快的方法是什么?可能将半视图渲染为位图图像上下文,并使用该视图在当前图像上下文的两个半视图上进行渲染?内容是动画的,因此
drawRect:
每秒大约执行60次。

您可以计算
CGPath
一次,您可以将整个路径构建为
CGPath
,而不是将其构建为
cgccontext
的一部分,或者,您可以在上下文中创建
CGContextCopyPath
后,使用它来获取
CGPath
。然后你可以在这条路上划一次。然后使用
CGContextAddPath
CGPath
放回
CGContext
中,并更改
CGContext
上的“更改变换”以获得具有类似以下变换的镜像
(-1,0,0,1,width,0)
,其中-1对x轴进行反射,而
宽度
应将其移回正确位置,并再次绘制路径。

一种有效的方法是在
CGLayer
的上下文上进行绘制操作,然后使用该层在当前
UIView
的上下文上绘制

有关更多详细信息,请参阅

基本上你会这样做:

- (void)drawRect:(CGRect)rect
{
    const CGFloat viewWidth = view.bounds.size.width;
    const CGFloat viewHeight = view.bounds.size.height;
    CGContextRef viewContext = UIGraphicsGetCurrentContext();
    CGLayerRef layer = CGLayerCreateWithContext(viewContext, CGSizeMake(viewWidth/2, viewHeight), 0);
    CGContextRef layerContext = CGLayerGetContext(layer);
    // Draw to the layerContext
    // using CGContextStrokePath() or whatever
    CGContextDrawLayerAtPoint(viewContext, CGPointZero, layer);
    CGContextTranslateCTM(viewContext, viewWidth, 0);
    CGContextScaleCTM(viewContext, -1, 1);
    CGContextDrawLayerAtPoint(viewContext, CGPointZero, layer);
    CGLayerRelease(layer);
}
此外,您可以将
CGLayerRef
存储为
UIView
的ivar,这样您就不会在每一帧都重新创建它


在我的情况下,此解决方案非常有效,但有两个注意事项:

  • 如前所述,苹果似乎不再推荐使用
    CGLayers
  • 为了使用
    CGLayers
    正确渲染视网膜屏幕,您必须遵循

听起来是个明智的解决方案,谢谢!然而,经过进一步的调查,我发现了一种方法,通过绘制到
CGLayer
。看看我刚才补充的答案。我认为当你翻转整个预渲染的半场景,而不是处理单独的路径时,层解决方案会更整洁。