0

我一直在寻找答案。我还在加快 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 是一个静态数组,它保存容器矩形,就像放置在整个图像中一样,s_shapePoints 包含一个映射出扭曲六边形的 CGPoint 结构数组。

现在,我想重新使用这个形状。它需要翻转和旋转以适应所有用途(为了记录,这些是“LED”显示器中的“段”)。

我的形状很好。没问题。

问题在于旋转它以供重复使用。似乎没有任何方法可以实际旋转 CGLayer。旋转 CALayers 的方法很多,但不是 CGLayers。我很乐意使用 CALayer,除了 CALayers 似乎都专注于光栅图形,我需要矢量图形。

我确信必须有一个明显的方法来解决这个问题。到目前为止,我看到的唯一方法是旋转整个目标图形上下文,绘制形状,然后取消旋转上下文。相当于转动房子拧下灯泡。

我可以让它工作的唯一方法是在单独绘制每个段之前实际转换点,这意味着不重复使用。在创建形状期间执行 CGContextRotateCTM 实际上不会导致显示时旋转元素。

有什么线索吗?

4

2 回答 2

2

到目前为止,我看到的唯一方法是旋转整个目标图形上下文,绘制形状,然后取消旋转上下文。相当于转动房子拧下灯泡。

我很确定这是你的解决方案。这就是绘图的CGContextRef工作原理。

我很乐意使用 CALayer,除了 CALayers 似乎都专注于光栅图形,我需要矢量图形。

您是否尝试过使用CAShapeLayer?

于 2012-07-02T13:37:40.583 回答
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,因为所有变换都以弧度表示(M_PI_2 是一个方便的宏,意思是“90°”),-1 将使旋转逆时针旋转。

calculateRectForElement 是一个计算出所有东西放置位置的函数。它只是返回一个定位元素的矩形。

_top_left_element 是一个类属性,它是一个 CALayer*。

我这样做了,比约恩·斯特朗金瑟拉姆是你的叔叔。

更新: 我想补充一点,您需要确保在卸载/销毁时 CGPathRelease 层的路径,否则您会泄漏。

于 2012-07-04T12:58:58.577 回答