首页 文章

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

提问于
浏览
1

我的情况:

我有一个带有内容视图的窗口(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并尝试将其superlayer设置为nil) . 更有趣的是,如果我将黑色子图层的不透明度设置为介于0和1 - 0.5之间的值,那么 - 然后所有内容视图的子视图的不透明度都会相应降低 .

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

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

1 回答

  • 1

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

相关问题