【问题标题】:CALayer not rendering contentsCALayer 不呈现内容
【发布时间】:2012-04-21 02:24:19
【问题描述】:

这个让我难过。我有一个CALayer,我在UIViewControllerviewDidLoad 方法中创建它,如下所示:

- (void)viewDidLoad {

    [super viewDidLoad];

    UIImage* img = [UIImage imageNamed:@"foo.png"];

    _imageLayer = [[CALayer alloc] init];

    _imageLayer.bounds = CGRectMake( 0, 0, img.size.width, img.size.height);
    _imageLayer.position = CGPointMake( self.view.bounds.size.width/2.0, self.view.bounds.size.height/2.0 );

    _imageLayer.contents = (id)img.CGImage;
    _imageLayer.contentsScale = img.scale;

    [self.view.layer addSublayer:_imageLayer];
    [_imageLayer setNeedsDisplay];
}

UIViewController 是从一个 nib 加载的,并放置在一个用代码创建的 UITabBarController 中。

我的问题是当UIViewController 变得可见时,CALayer 不会呈现其UIImage 内容。我可以使CALayer 呈现UIImage 的唯一方法是在UIViewController 可见后将其内容设置为UIImage,例如在viewDidAppear: 方法中。

我真的更愿意在 viewDidLoad 方法中完成我的所有设置(这不是它的用途吗?)。如何让CALayer 呈现其内容?

【问题讨论】:

  • 为什么在新层(未修改)而不是视图层上调用-setNeedsDisplay
  • 只是一个简单的尝试让它渲染。
  • 哦,等等,我明白你的意思了。如果我删除[_imageLayer setNeedsDisplay];,它工作得很好。那里发生了什么?
  • 我的意思是,setNeedsDisplay 需要在 superview 上调用,而不是在 subview 上。

标签: objective-c ios cocoa-touch calayer


【解决方案1】:

您不需要图层或超级视图上的 setNeedsDisplay

setNeedsDisplay 告诉层或视图它需要重绘其内容。 (对于视图,它将调用 drawRect: 来获取新内容;对于 CALayer,它将询问其委托。)请注意,这只会影响视图或图层本身,而不影响其子级。

由于您直接为图层提供内容,因此您不希望 CA 丢弃该内容并要求替换。

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 2020-07-26
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2022-11-19
    • 2014-08-03
    相关资源
    最近更新 更多