1

我的情况:

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

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

(哦,有截图,但不能以新用户的身份发布图像。你必须发挥你的想象力。)

很简单。因此,我所要做的就是检查它是否正确隐藏/删除了自己。然后问题来了。任何隐藏、移除或减少黑色层或将其透明度降低到 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 的顶层实际上有一个子层,不仅用于我手动添加的黑色方块,而且还用于每个子视图(无论是源自笔尖还是在加载视图后由我手动创建)笔尖),因此当我认为我只是在黑匣子上操作时,它们为什么都消失了/消失了。但是我仍然不知道为什么所有子视图都有层,它们来自哪里,以及如何摆脱它们(同样,所有删除它们的尝试 - 通过 removeFromSuperlayer,设置为 nil 等 - 失败。

4

1 回答 1

1

子视图(控件)具有设置为父视图层的子层的层。所以循环遍历所有子层也作用于这些子视图层。

于 2010-10-10T00:56:36.553 回答