【问题标题】:adding a sublayer to CALayer works only in mouseDown method向 CALayer 添加子层仅在 mouseDown 方法中有效
【发布时间】:2012-08-21 19:44:29
【问题描述】:

我正在尝试将 CALayer 添加到 NSView。我没有工作的代码是

-(void) InsertCALayer
{
    newLayer = [CALayer layer];
    newLayer.frame = NSMakeRect(10, 10, 100, 100);
    newLayer.backgroundColor = CGColorCreateGenericRGB(0.5, 0.5, 0.5, 1.0);
    [rootLayer addSublayer:newLayer];
}

但是,此代码没有显示任何内容。奇怪的是,我还实现了一个 mouseDown 事件处理程序,并且代码确实在那里工作:

-(void) mouseDown:(NSEvent *)theEvent
{   
    newLayer = [CALayer layer];
    newLayer.frame = NSMakeRect(10, 10, 100, 100);
    newLayer.backgroundColor = CGColorCreateGenericRGB(0.5, 0.5, 0.5, 1.0);
    [rootLayer addSublayer:newLayer];
}

我可以确认这两种方法肯定都会被调用,但我很困惑为什么一种方法有效而另一种方法无效。有什么想法吗?

【问题讨论】:

    标签: objective-c macos core-animation calayer nsview


    【解决方案1】:

    -(void) InsertCALayer
    

    在视图层次结构加载后调用方法?如果您在调试器中的 InsertCaLayer 方法中设置断点并 'po' rootLayer 是否有有效对象?

    在您对其进行更改之前,必须完全加载视图层次结构。我想知道这是否是这里的问题。告诉我!

    【讨论】:

    • 啊哈!似乎这就是问题所在。 'po rootLayer' 在 mouseDown 方法内输出一个真实的内存地址,但在 InsertCALayer 内它是空的。知道如何在添加图层之前强制加载视图层次结构吗?考虑到在 InsertCALayer 之前多次调用“drawRect”,它还没有加载似乎很奇怪
    • 对于这篇文章的未来查看者,代码 "if (!rootLayer) { rootLayer = [CALayer layer]; [self setLayer:rootLayer]; [self setWantsLayer:YES]; } " 似乎可以诀窍
    • 应该这样做!请注意,如果您在其他地方有设置支持层的代码,您应该清楚哪个 CALayer 实际用作 rootLayer。
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多