我一直在寻找答案。我仍然想要加速iOS开发,所以我绝对可以接受我在这里可能是无聊的。然而,完全缺乏答案让我想知道是否真的有答案。
这是交易:我使用CGLayer生成一个相当基本的矢量多边形:
- (CGLayerRef)getASegment
{
CGSize layerSize = s_viewRects[kASegment].size;
CGLayerRef theLayer = CGLayerCreateWithContext ( UIGraphicsGetCurrentContext(),
layerSize, nil );
CGContextRef context = CGLayerGetContext ( theLayer );
CGContextAddLines ( context, s_shapePoints, 7 );
return theLayer;
}
s_viewRects是一个静态数组,用于保存容器rects,放置在整个图像中,s_shapePoints包含一个CGPoint结构数组,用于映射扭曲的六边形。
现在,我想重新使用这个形状。它需要翻转和旋转以适应所有用途(对于记录,这些是“LED”显示中的“段”)。
我的形状很好。没问题。
问题在于旋转它以便重复使用。似乎没有任何方法可以实际旋转CGLayer。有很多方法可以轮换CALayers,但不能轮换CGLayers。我很乐意使用CALayer,除了CALayers似乎都专注于光栅图形,我需要矢量图形。
我确信必须有一个明显的方法来解决这个问题。到目前为止,我所看到的唯一方法是旋转整个目标图形上下文,绘制形状,然后取消旋转上下文。相当于翻开房子拧开灯泡。
我可以让它工作的唯一方法是在分别绘制每个段之前实际转换点,这意味着不能重复使用。在创建形状期间执行CGContextRotateCTM实际上不会在显示时导致旋转元素。
任何线索?
答案 0 :(得分:2)
到目前为止,我所看到的唯一方法是旋转整个目标图形上下文,绘制形状,然后取消旋转上下文。相当于翻开房子拧开灯泡。
我很确定这是你的解决方案。这是使用CGContextRef
进行绘制的方式。
我很乐意使用CALayer,除了CALayers似乎都专注于光栅图形,我需要矢量图形。
您是否尝试使用CAShapeLayer
?
答案 1 :(得分:0)
好的,正如所承诺的,这是代码。
首先,我使用CAShapeLayer,并以类似于上面的方式创建它:
- (CALayer *)getSegment
{
CGRect layerFrame = CGRectMake ( 0, 0, s_viewRects[kASegment].size.width, s_viewRects[kASegment].size.height );
CAShapeLayer *ret = [CAShapeLayer layer];
[ret setFrame:layerFrame];
CGMutablePathRef thePath = CGPathCreateMutable ();
CGPathAddLines ( thePath, nil, s_shapePoints, 7 );
[ret setPath:thePath];
return ret;
}
然后,我将它设置为一个主层,就像这样,沿途进行转换:
_top_left_element = [self getSegment];
frame = [self calculateRectForElement:_top_left_element];
CATransform3D transform = CATransform3DIdentity;
transform = CATransform3DRotate(transform, M_PI_2, 0.0, 0.0, -1.0 );
[_top_left_element setTransform:transform];
[_top_left_element setFrame:frame];
[_main_element addSublayer:_top_left_element];
CATransform3DRotate是必需的,因为图层的转换属性是3D转换属性。我使用M_PI_2,因为所有变换都是Radians(M_PI_2是一个方便的宏,意思是“90°”),-1将使旋转逆时针旋转。
calculateRectForElement是一个能够确定所有内容放置位置的函数。它只返回一个定位元素的矩形。
_top_left_element是一个类属性,它是CALayer *。
我这样做了,Bjorn Strongintheram是你的叔叔。
更新: 我想补充一点,你需要确保你在卸载/破坏时CGPathRelease图层的路径,否则你会泄漏。