3

次のコードを使用して、CoreAnimationレイヤーからUIImageを作成できます。

- (UIImage*)contentsImage;
{
   UIGraphicsBeginImageContext([self bounds].size);
   [self renderInContext:UIGraphicsGetCurrentContext()];
   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return image;
}

このコードは私のCALayer派生クラスにあります。私が遭遇している問題は、結果の画像にレンダリングされない私のレイヤーの子レイヤーである2つのCAShapeLayersがあることです。標準のCALayerを子として追加すると、正常にレンダリングされます。Appleのドキュメントによると:

レシーバーとそのサブレイヤーを指定されたコンテキストにレンダリングします。

また、iPhoneOS2.0以降で利用可能になっているとも書かれています。足りないものがあるのか​​、レーダーを提出する必要があるのか​​疑問に思います。

子CAShapeLayersが画像に引き付けられないようにするためのアイデアはありますか?

ありがとう。

4

3 に答える 3

4

CALayer機構は、renderInContextを呼び出して、ビットマップされたコンテンツプロパティを作成します。ただし、CAShapeLayerでは、ヘッダーの次の注記に示されているように、pathプロパティは実際にはそのコンテンツにレンダリングされません。

全体としての形状は、レイヤーのコンテンツとその最初のサブレイヤーの間で合成されます。

renderInContextが実際にCAShapeLayerパスをコンテキストにレンダリングしないのは当然のことです。しかし、私は実際にこれを自分で試したことがありません。

于 2009-09-02T04:37:38.947 に答える
0

それがあなたに関連しているかどうかはわかりませんが、renderInContextのCALayerドキュメントに次のようなメモがあります。

**重要**:このメソッドのMac OSXv10.5実装はそうではありません
CoreAnimationコンポジションモデル全体をサポートします。QCCompositionLayer、
CAOpenGLLayer、およびQTMovieLayerレイヤーはレンダリングされません。さらに、
3D変換を使用するレイヤーはレンダリングされず、指定するレイヤーもレンダリングされません
backgroundFilters、filters、compositingFilter、またはマスク値。
Mac OS Xの将来のバージョンでは、これらのレイヤーのレンダリングのサポートが追加される可能性があります
およびプロパティ。

とにかく、UIView drawRect関数を画像コンテキストでの描画と組み合わせて使用​​すると、同様の問題が発生しました。drawRectを呼び出した場合、サブビューを含む全体的なUIViewはそのサブビューを描画しません(drawRectを呼び出すと、スーパービューとサブビューの実装に関係なく、その領域全体を埋める責任があるとドキュメントに記載されているため、実際には意味があります)。すべてのサブビューでdrawRectを呼び出して、独自のフレームを渡すことで、問題を解決しました。

したがって、renderInContextから切り替えて、代わりにCALayerのdrawInContextを使用することをお勧めしますか?デフォルトでは何も実行しないため、メソッドをオーバーライドする必要があります。サブクラスも、コンテキストを適切なフレームに移動する必要があります。また、安全のために、追加したコードがこれらのレイヤーの通常のレンダリングに影響を与えないことを確認することをお勧めします。

于 2009-08-17T02:40:47.400 に答える
0

私はこれについてレーダーを提出しました。ドキュメントに機能しない理由がわかりません。Appleがレーダーに応答した場合は、ここに返信します。

于 2009-08-29T03:08:04.537 に答える