将UIImage绘制到CALayer.contents中不会呈现图像数据。

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. 代码按照正确的逻辑顺序调用:initsetImage:setFrame;

这里到底发生了什么?


此问题相同的问题和解决方案。不要调用[self.imageLayer setNeedsDisplay] - Kurt Revis
1个回答

14

删除这一行:

[self.imageLayer setNeedsDisplay];

-setNeedsDisplay方法告诉一个CALayer对象需要重新绘制它的内容。由于你已经提供了该层的内容,因此你不希望Core Animation丢弃该内容并请求替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接