【问题标题】:Hiding/Removing/Fading CALayer erasing NSView contents隐藏/删除/淡化 CALayer 擦除 NSView 内容
【发布时间】:2011-04-11 12:59:18
【问题描述】:

我的情况:

我有一个带有内容视图 (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 setHidden:YES] 替换为 [layer setOpacity:0] 具有擦除内容视图的相同效果,完全删除 blackLayer 也是如此(通过调用 removeFromSuperlayer 并尝试设置其 superlayer为零)。更有趣的是,如果我将黑色子层正方形的不透明度设置为 0 到 1 - 0.5 之间的某个值,比如说 - 那么所有内容视图的子视图的不透明度都会相应降低。

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

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

【问题讨论】:

    标签: drawing core-animation calayer nsview erase


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多