2012-02-11 16 views
3

私はこの回答を見つけることができません。Howto CALayerの境界から独立したCALayerの画像スケール

calayerのイメージサイズをcalayerの境界のサイズよりも小さくする方法を知りたいと思います。

私はiPadゲームでいくつかのポーンを持っています。それぞれはCALayerであり、contentsGravity = kCAGravityResizeAspectでサイズを変更しています。画像は30x30のCALayerの内部に128x128ですので、画像は自動的に30x30にリサイズされ、両方がボックスなのでアスペクト比は維持され、機能します。

ここで私はCALayerの境界をスーパービューのサイズに比例して設定していますので、Pawnは常に同じ相対サイズをビューに表示します。私の場合にはCALayerの境界がタッチのために小さい30×30の最大値を取得すること

-(void) setSpriteScaleToDice { 
    CGFloat newSize = [self superlayer].bounds.size.width * 0.066666667f; 
    self.bounds=CGRectMake(0.0f, 0.0f, newSize, newSize); 
    self.contentsGravity = kCAGravityResizeAspect; 
} 

注:この1はCALayerのの私のスプライトクラスのサブクラス内にあります。それは私が直面している問題です。小さなサイズのため、タッチするのが難しく、時にはタッチが失敗することがあります...

私が考えている考えの1つは、画像を元のサイズに保ちます。問題は私がたくさんの検索をして、contentsGravity、contentsCenter、contentsScaleなどでいくつかのオプションを試してみたところ成功しなかったことです。しかし私は、ビットマップの変形を得る。特に

、進むべき道は、(contentsGravityを使用していない)contentsCenterであるようにリンゴのドキュメントごとに見えるよう、...

、任意のアイデアが本当に歓迎されてください、と事前のおかげで、

ルイス

+0

あなたは層の境界よりも小さいCGImageを作り、kCAGravityResizeAspectを使用してみましたか? –

+0

あなたの答えをありがとう、私はそれを試してみました、問題は "時々"私は128x128に境界を増加させる必要があり、小さな元のcgimageから来て、多くの解像度を失うだろうということです。 –

答えて

2

これはおそらく愚かな質問ですが、UIViewsの代わりにCALayersを使用しているのはなぜですか? UIImageViewには、これを簡単に行うことができるcontentModeプロパティがあります(タッチイベント処理に使いやすいとは言えません)。

つまり、CALayerにはコンテンツが描画されるための部分矩形を定義できるように見えるcontentsRectプロパティがあり、ユーザーが望むようにすることができます。

もう1つの選択肢は、画像レイヤーをより大きなレイヤーに配置し、ヒットテストに使用することです。

+0

あなたの答えをありがとう、私は最終的にスプライトとテクスチャアトラス(おそらくuiviews)を処理​​するのに最適なCALayerの方法を行くことを決めた、そして同時に私はココアとココアのために同時に開発しています私はそのように行った。あなたの2番目のオプション(contentsRect)は私がテクスチャアトラスをやっているので、それを使うことはできません。そして、あなたの3番目の提案は非常に面白いです...私は明日それを試して戻ってくるでしょう。ありがとう。 –

+0

こんにちは。最後に、画像レイヤーをより大きなレイヤーに配置し、両方のレイヤーを最もホットなものにするというオプションを使用しました。今は期待どおりに動作しています。どうもありがとう。 –

1

あなたのイメージがCALayerの以外のサイズでCALayerの中で描かれた場合、あなたはあなた自身のdrawInContext:メソッドを作成して、かなりのCALayerのcontentsプロパティを設定するよりも、画像を描画する必要があります。 contentsプロパティを設定しないで、描画するイメージを追跡するために独自のプロパティを作成します。

+0

お薦めいただきありがとうございます。私は最初のニックのオプションをテストし、次にこれを試します。再度、感謝します。 –

+1

drawInContextをオーバーライドするとかなり遅くなると思います。OpenGLの代わりにCore Graphicsを使用しているため、ハードウェアアクセラレーションではありません。 –

+0

@NickLockwoodシステムは、OpenGL(またはMetal)のみを使用して合成します(常にCALayersとCoreImage画像を合成するときだけでなく、CoreGraphicsの多くの合成操作にも使用します) - どのようなシステムであっても、 )。ビットマップ画像をビットマップ描画コンテキストに描画すると、実際には合成されていて描画はできず、GPUで簡単に行うことができます。描画とは、テキストや線、矩形、楕円やグラデーションを描画する場合です。 – Mecki

2

のCALayer CGFloat contentsScale

/* Defines the scale factor applied to the contents of the layer. If 
* the physical size of the contents is '(w, h)' then the logical size 
* (i.e. for contentsGravity calculations) is defined as '(w/
* contentsScale, h/contentsScale)'. Applies to both images provided 
* explicitly and content provided via -drawInContext: (i.e. if 
* contentsScale is two -drawInContext: will draw into a buffer twice 
* as large as the layer bounds). Defaults to one. Animatable. */