質問

次のコードを使用して、コア アニメーション レイヤーから UIImage を作成できます。

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

   return image;
}

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

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

また、iPhone OS 2.0から利用可能になっているとも書かれています。何か足りないものがあるのか​​、それともレーダーに通報すべきなのか迷っています。

子 CAShapeLayers が画像に引き寄せられないようにする方法はありますか?

ありがとう。

役に立ちましたか?

解決

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

全体としての形状は、レイヤーの内容とその最初のサブレイヤーとの間に構成されます。

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

他のヒント

あなたに関係があるかどうかはわかりませんが、CALayer のドキュメントには renderInContext に関する次のような注記があります。

**Important**: The Mac OS X v10.5 implementation of this method does not
support the entire Core Animation composition model. QCCompositionLayer, 
CAOpenGLLayer, and QTMovieLayer layers are not rendered. Additionally,
layers that use 3D transforms are not rendered, nor are layers that specify 
backgroundFilters, filters, compositingFilter, or a mask values. 
Future versions of Mac OS X may add support for rendering these layers
and properties.

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

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

これについてレーダーを照射しました。ドキュメントにはそれが機能しない理由が見当たりません。Apple がレーダーに返答した場合、ここで返答します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top