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
。看看我刚才补充的答案。我认为当你翻转整个预渲染的半场景,而不是处理单独的路径时,层解决方案会更整洁。