使用NSView层作为另一个NSView的掩码,并仍然显示它

时间:2015-04-02 18:05:39

标签: macos cocoa core-animation

我有两个NSView,ab。具体而言,aWebViewbNSVisualEffectView,但我认为这不重要。

a包含非矩形Alpha通道中的内容,我想使用b的alpha通道屏蔽a。但是,我仍希望在a之上显示bb的半透明部分仍然可以看到a

我现在拥有的东西:

我在Interface Builder中设置ab并连接到我的AppDelegate。他们是兄弟姐妹,是NSWindow默认NSView的唯一孩子。他们都被限制在完全填补NSWindow。

如果我现在运行该应用程序,我会在a

之上显示b

然后,在applicationDidFinishLaunching:中,我致电

((NSView*) self.window.contentView).wantsLayer = YES;
self.b.layer.mask = self.a.layer;

这导致b根据a的alpha通道正确屏蔽。 然而a不再可见。此时,我不知道a是否完全没有显示,或者只是显示 b后面。我希望仍然能够看到a,并通过b的任何半透明部分看到a。这可能只是通过某种方式修改图层操作来实现吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

考虑到像Photoshop一样的alpha通道的常见用法,这已经是正确的行为了。 掩模的概念是从一些其他矩形图像中切割出碎片,掩模本身保持不可见。这为您提供了所有选择。 拥有"面具"它也必须在第二次显示,在其他元素的顶部或底部(不会转换为蒙版),可能具有一些alpha值,使其部分透明。 现在的问题出现了,取决于具体的掩码元素,是否可以简化以节省一些内存 - 这当然是项目依赖的。 我需要在我的关于框中的透明蒙版文本(文本在动画时淡出)并且你的代码对我来说很好,我试图创建你想要的东西,这是最简单的方法: 作为(测试)面具视图,我在phososhop中创建了一个半透明的单色星形,从全白色流动到几乎完全透明。 在IB中,我把它放到一个图像视图中,我将其命名为maskView并复制了这个并将其命名为maskLayer。可以看到maskLayer,maskView用于将文本剪切成星形褪色形状。文本是CustomView上的Textfield,也是IB中的Textfield。我将所有三个连接到windowDidLoad中的windowController我把我的代码变体:

- (void)windowDidLoad
{
    [super windowDidLoad];

    ((NSView*) self.window.contentView).wantsLayer = YES;
    [((NSView*) self.window.contentView) addSubview:maskLayer];
    [((NSView*) self.window.contentView) addSubview:TextView];
    [TextView addSubview:maskView];
    TextView.layer.mask = maskView.layer;
}

这会产生一个半透明的白色星星,黑色褪色文字输入,重叠的文字被切断:-D (值得一提的是,maskLayer和maskView必须是IB中的两个不同实例,但它们可以共享相同的.png)

相关问题