我的情况:
我有一个带有内容视图(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 等 - 失败。