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 を実際に回転させる方法はないようです。CALayer を回転する方法はたくさんありますが、CGLayer は回転しません。CALayer はすべてラスター グラフィックスに重点を置いているようであり、ベクター グラフィックスが必要であることを除けば、CALayer を喜んで使用します。

これに対処する明白な方法があるに違いないと確信しています。私がこれまで見てきた唯一の方法は、ターゲット グラフィックス コンテキスト全体を回転させ、形状を描画してから、コンテキストの回転を解除することです。家を回して電球を外すのと同じです。

私がそれを機能させる唯一の方法は、各セグメントを個別に描画する前にポイントを実際に変換することです。つまり、再利用はありません。形状の作成中に CGContextRotateCTM を実行しても、実際には要素が回転して表示されるわけではありません。

手がかりはありますか?

4

2 に答える 2

2

私がこれまで見てきた唯一の方法は、ターゲット グラフィックス コンテキスト全体を回転させ、形状を描画してから、コンテキストの回転を解除することです。家を回して電球を外すのと同じです。

それがあなたの解決策だと確信しています。CGContextRefそれが作品を描く方法です。

CALayer はすべてラスター グラフィックスに重点を置いているようであり、ベクター グラフィックスが必要であることを除けば、CALayer を喜んで使用します。

を使ってみましたCAShapeLayerか?

于 2012-07-02T13:37:40.583 に答える
0

OK、約束どおり、これがコードです。

まず、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];

レイヤーの変換プロパティは 3D であるため、CATransform3DRotate が必要です。すべての変換がラジアン単位であるため (M_PI_2 は「90°」を意味する便利なマクロです)、M_PI_2 を使用します。-1 は回転を反時計回りにします。

calculateRectForElement は、すべてがどこに配置されているかを把握する関数です。要素を配置する rect を返すだけです。

_top_left_element は、CALayer* であるクラス プロパティです。

私はこれをやった、ビョルン・ストロングインテラムはあなたの叔父だ。

更新: アンロード/破棄でレイヤーのパスを CGPathRelease することを確認する必要があることを追加したいと思います。そうしないと、リークが発生します。

于 2012-07-04T12:58:58.577 に答える