私のUIのサブクラスでは、サブレイヤを広範囲に使用して複雑な画像を作成しています。画面上には最大30個のビューがあり、iPad 2では、perimeterPath(perimeterLayerのパス属性)に沿ったアニメーションのパフォーマンスが苦しんでいました。画像コンテキストへのCALayerのレンダリングが黒を返しています
元々、ビューレイヤーのサブレイヤとして構成レイヤーを追加していました。
[self.layer addSublayer:self.leftsideLayer]; // CAShapeLayer
[self.layer addSublayer:self.rightsideLayer]; // CAShapeLayer
[self.layer addSublayer:self.perimeterLayer]; // CAShapelayer
[self.layer addSublayer:self.valueLayer]; // CAShapeLayer
[self.layer insertSublayer:self.gradientLayer atIndex:0]; // CAGradientLayer + CAShapeLayer (as mask)
オンスクリーンのレンダリングは完璧です。しかし、アニメーションが遅れを開始しているので、私はテンポラリレイヤーをビットマップにレンダリングする意図で、このレイヤーをビルドするためにこのコードを準備しました。ステップ1は、既存のコードを若干修正するためのものです。
CALayer *tmpLayer = [CALayer layer];
[tmpLayer addSublayer:self.leftsideLayer]; // CAShapeLayer
[tmpLayer addSublayer:self.rightsideLayer]; // CAShapeLayer
[tmpLayer addSublayer:self.perimeterLayer]; // CAShapelayer
[tmpLayer addSublayer:self.valueLayer]; // CAShapeLayer
[tmpLayer insertSublayer:self.gradientLayer atIndex:0]; // CAGradientLayer + CAShapeLayer (as mask)
[self.layer addSublayer:tmpLayer];
予想通り、うまくいきました。
次のステップは、すべてのこれらの層のプリレンダリングされたバージョンを生成することであろう。
// [self.layer addSublayer:tmpLayer];
UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[self drawLayer:tmpLayer inContext:ctx];
UIImage *renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext();
if (!renderedImageOfMyself) {
NSLog(@"Well that didn't work");
}
UIGraphicsEndImageContext();
[self.layer setContents:renderedImageOfMyself.CGImage];
その結果は、私が試したので、次は、画面上に黒の四角形であった:
// [self.layer setContents:renderedImageOfMyself.CGImage];
[self addSubview:[[UIImageView alloc] initWithImage:renderedImageOfMyself]];
これも私に黒い矩形を与えているので、画面上に黒い矩形をつける方法はどちらもうまくいくと結論づけましたが、どういうわけか、トップレイヤーをビットマップグラフィックスコンテキストにレンダリングしてしまいました。
私は新しいコンテキストの開始のオプション部分で手を加えましたが、YESとNOの違いは1.0と0.0です。すべて無駄に。
私はの過程で何をしないのです:
- 新しいグラフィックスコンテキストを開始
- その文脈の中に私の層を描く
- は、そのコンテキスト
から画像を取得しますか?
ありがとうございます!