隐藏/删除/淡化CALayer擦除NSView内容

时间:2010-09-13 07:26:29

标签: drawing core-animation calayer nsview erase

我的情况:

我有一个带有内容视图的窗口(NSView),它有几个子视图(普通的NSControl子类;不重要,只是用于测试)。对于我想要达到的最终效果的一部分,我想放置一个半透明的黑色CALayer覆盖整个窗口的内容视图,并且能够使其不可见(通过隐藏它或删除它,无关紧要)触发某个事件时,完全清晰地显示NSView。

出于测试目的,我放置了一个小的半透明黑色CALayer,仅覆盖主要内容视图中的部分/部分子视图(控件),如下所示:

(doh,有截图但不能以新用户身份发布图片。你必须运用自己的想象力。)

足够简单。所以我试图做的就是检查它是否正确隐藏/移除。然后出现了问题。任何隐藏,删除或减少黑色图层或将其透明度降低到0的尝试都会导致所有窗口的子视图被删除,结果如下所示:

(一个完全空白的窗口[默认窗口bg颜色]内容视图)

这是代码的主要内容,在主应用程序调用中有一个对主窗口的引用:

    // I set up my main view in a nib, which I load and will add
    // to the app window as the main content view
    NSViewController * controller = [[NSViewController alloc]
    initWithNibName:@"InterfaceTesting" bundle:nil];

    NSView * view = [controller view];

    // enable layers, grab root
    [view setWantsLayer:YES];       
    CALayer * rootLayer = [view layer];

    // set up black square
    CALayer * blackLayer = [CALayer layer];
    [blackLayer setFrame:NSMakeRect(150, 150, 100, 100)];
    [blackLayer setBackgroundColor:CGColorCreateGenericRGB(0,0,0,0.5)];
    [rootLayer addSublayer:blackLayer];

    // hide all sublayers of root (ie the black square)     
    for (CALayer * layer in [[view layer] sublayers])
        [layer setHidden:YES];

    // add to main window
    [self.window setContentView:view];

正如我之前提到的,用[layer setOpacity:0]替换[layer setHidden:YES]与删除内容视图具有相同的效果,就像删除blackLayer一样(通过调用removeFromSuperlayer并尝试设置其超级层)为零。更有趣的是,如果我将黑色子图层的不透明度设置为介于0和1 - 0.5之间的值,那么 - 然后所有内容视图的子视图的不透明度都会相应降低。

所以我在这里感到困惑,因为我不明白为什么隐藏/删除或减少小黑色CALayer上的不透明度会影响它所属视图中的所有子视图,即使它不包括。非常感谢任何帮助。

编辑:我发现contentView的顶层实际上有一个子图层不仅适​​用于我手动添加的黑色方块,而且还适用于每个子视图(无论是来自笔尖还是加载后我手动创建的)从笔尖看,因为当我以为我只是在黑匣子上操作时,为什么它们都在消失/消失。但我仍然不知道为什么所有子视图都有层,它们来自哪里,以及如何摆脱它们(再次,所有尝试删除它们 - 通过removeFromSuperlayer,设置为nil等 - 失败。

1 个答案:

答案 0 :(得分:1)

子视图(控件)具有设置为父视图图层的子图层的图层。因此,循环遍历所有子图层也会对这些子视图层起作用。