5

に画像を表示するのに苦労していCALayer.contentsます。かなり簡単に思えますが、何をしても画像をレンダリングできません。CALayer背景色と角の半径を確認できるため、レンダリングは正常に行われますが、画像は読み込まれません。

ここに画像の説明を入力

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

これを設定するコードは非常に簡単です。でinit

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

その後、画像を設定しました:

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

最後に、内setFrame

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. レイヤーが正しく追加されていることは明らかです。
  2. 画像が追加され、機能します。[UIImage imageNamed:@"info.png"]コードの他の場所で使用されており、実際に表示され、画像が表示されます。1x で 16x16、2x で 32x32 です。
  3. コードは正しい論理順序で呼び出されています: init, setImage:, setFrame;

ここで何が起こっているのですか?

4

1 に答える 1

14

次の行を削除します。

[self.imageLayer setNeedsDisplay];

-setNeedsDisplayコンテンツを再描画する必要があることをレイヤーに伝えます。レイヤーのコンテンツは既に提供しているため、CA がそのコンテンツを破棄して交換を要求することは望ましくありません。

于 2012-06-10T23:23:02.013 に答える