2012-06-10 30 views
5

我有一段恶心的时间试图让图像出现在CALayer.contents中。这看起来很直截了当,但无论我做什么,我都无法让图像呈现。 CALayer渲染得很好,因为我可以看到它的背景颜色和角半径,但图像不会加载。将UIImage绘制到CALayer.contents不会渲染图像数据

enter image description here

你所看到的是一个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. 该图层是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丢弃该内容并要求替换。