2012-06-10 15 views
5

CALayer.contentsに画像を表示しようとすると邪悪な時間があります。それはむしろまっすぐ進むようですが、私が何をしてもイメージをレンダリングすることはできません。 CALayerは、背景色とコーナー半径がわかるので、レンダリングがうまくいきますが、画像は読み込まれません。UALmageをCALayer.contentsに描画すると画像データがレンダリングされません

enter image description here

あなたがここで見ていると、適用されたマスクとCAGradientLayerサブクラスです。内側の四角は、画像を表示したい場所で、サブクラスCAGradientLayerのサブレイヤとして追加されています。

これを設定するコードはかなり簡単です。 initで:setFrame内の最後に

- (void)setImage:(UIImage *)image { 
    self.imageLayer.contents = (id)image.CGImage; 
    [self.imageLayer setNeedsDisplay]; 
} 

、::後に続いて

self.imageLayer = [CALayer layer]; 
self.imageLayer.cornerRadius = kDefaultCornerRadius; 
self.imageLayer.backgroundColor = [UIColor darkGrayColor].CGColor; 
[self addSublayer:self.imageLayer]; 

、私は画像を設定

CGFloat imageSize = self.bounds.size.width - 2*kDefaultMargin; 
[self.imageLayer setBounds:CGRectMake(0.0, 0.0, imageSize, imageSize)]; 
[self.imageLayer setPosition:CGPointMake(self.bounds.size.width/2.0f, kDefaultMargin + imageSize/2.0f)]; 
[self.imageLayer setNeedsDisplay]; 

私はすでに知っているかチェックしているもの:

  1. レイヤーはobvです私はそれが目に見えることで正しく明らかに追加されました。
  2. 画像が追加されて動作します。 [UIImage imageNamed:@"info.png"]はコードの他の部分で使用されており、実際には表示され、イメージされています。 1xで16x16、2xで32x32です
  3. コードは正しい論理順序で呼び出されています。initsetImage:setFrame;

ここでは何が起こっていますか?

+0

[この質問と同じ問題と解決策(http://stackoverflow.com/q/10060912/1218876)。 '[self.imageLayer setNeedsDisplay]'を呼び出さないでください。 –

+0

確かに、私はそれを受け入れることができるので、それは答えではなく、コメントでなければなりません。 – coneybeare

答えて

13

この行を削除します。

[self.imageLayer setNeedsDisplay]; 

-setNeedsDisplayは、その内容を再描画する必要がある層に指示します。すでにレイヤーのコンテンツを提供しているので、CAがそのコンテンツを破棄して置き換えを依頼することは望ましくありません。

関連する問題