2012-07-31 5 views
19

私はCALayerを持っており、伸縮可能な画像を追加したいと考えています。私がちょうどすれば:CALayer.contentsに伸縮可能なUIImageを追加するには?

 _layer.contents = (id)[[UIImage imageNamed:@"grayTrim.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0, 15.0, 0.0, 15.0)].CGImage; 

レイヤのデフォルトcontentGravityはkCAGravityResizeなので、これは動作しません。

私はcontentsCenterを使ってこれを行うことができたと読んだことがありますが、CALayerで伸ばした画像をどの程度正確に伸ばすことができないのか分かりません。

どのようなアイデアも大歓迎です!

ホラチュー

答えて

33

この質問に対する回答はこれです。幅が伸び、高さが固定された伸縮性のある画像があるとします(単純化のため)。

画像が31px幅で( - ストレッチしません - 15ピクセルの固定サイズ、1ピクセルが引き伸ばされます)あなたの層を想定し

はCALayerのサブクラスである、あなたのinitメソッドは次のようになります。

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     UIImage *stretchableImage = (id)[UIImage imageNamed:@"stretchableImage.png"]; 
     self.contents = (id)stretchableImage.CGImage; 

     self.contentsScale = [UIScreen mainScreen].scale; //<-needed for the retina display, otherwise our image will not be scaled properly 

     self.contentsCenter = CGRectMake(15.0/stretchableImage.size.width,0.0/stretchableImage.size.height,1.0/stretchableImage.size.width,0.0/stretchableImage.size.height); 
    } 
    return self; 
} 
をドキュメントごとに

のcontentsCenter矩形は0〜1の値を持たなければなりません。

単位矩形(0.0,0.0)(1.0,1.0)にデフォルト設定され、画像全体が拡大縮小されます。長方形が単位矩形の外側に広がる場合、結果は未定義です。

これはそれです。うまくいけば、他の誰かがこれを見つけると、開発時間を節約できます。

+0

私はそれが役に立ちました。ありがとう! – duci9y

+1

画像の縮尺を使用する方が良いです。 –

+6

画像の@ 3xバリアントが存在しない場合は、iPhone 6 plusで提案されたソリューションが失敗します。画像のスケールプロパティを使用する方がよいでしょう。 'self.contentScale = strechableImage.scale'画像のすべての変種(@ 2x @ 3x)が存在しない場合でも動作します。 –

関連する問題