iOS:如何旋转CGLayer?

时间:2012-07-02 11:52:42

标签: iphone ios vector transformation cglayer

我一直在寻找答案。我仍然想要加速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实际上不会在显示时导致旋转元素。

任何线索?

2 个答案:

答案 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图层的路径,否则你会泄漏。