即将推出的 OSX 10.10(“Yosemite”)提供了一种新型视图 NSVisualEffectView,它支持通过窗口或窗口内的半透明。我最感兴趣的是通过窗口半透明,所以我将在这个问题中关注它,但它也适用于窗口内半透明。
在 10.10 中使用透窗半透明是微不足道的。您只需NSVisualEffectView
在视图层次结构中放置一个位置并将其设置blendingMode
为NSVisualEffectBlendingModeBehindWindow
. 这就是它所需要的。
在 10.10 下,您可以NSVisualEffectView
在 IB 中定义 s,设置它们的混合模式属性,然后您就可以开始运行了。
但是,如果您想向后兼容早期的 OSX 版本,则不能这样做。如果您尝试NSVisualEffectView
在您的 XIB 中包含一个,您将在尝试加载 XIB 时立即崩溃。
我想要一个“设置它并忘记它”的解决方案,它在 10.10 下运行时会提供半透明效果,而在早期操作系统版本上运行时会简单地降级为不透明视图。
到目前为止,我所做的是使有问题的视图成为 XIB 中的普通 NSView,然后添加检查 的代码(由 awakeFromNib 调用),[NSVisualEffectView class] != nil
当它定义了类时,我创建了一个 NSVisualEffectView 的实例,将我当前视图的所有子视图移动到新视图,并将其安装到位。这行得通,但是每次我想要半透明视图时,我都必须编写自定义代码。
我认为这可能使用 NSProxy 对象。这就是我的想法:
定义一个自定义的 NSView 子类(我们称之为 MyTranslucentView)。在所有初始化方法(initWithFrame 和 initWithCoder)中,我会丢弃新创建的对象,而是创建一个具有私有实例变量(myActualView)的 NSProxy 子类。在初始化时,如果 OS>=10.10,它将决定将 myActualView 对象创建为 NSVisualEffectView,并在 OS<10.10 下创建正常的 NSView。
代理会将所有消息转发到它的 myActualView。
这将是相当繁琐的低级代码,但我认为它应该可以工作。
有没有人做过这样的事情?如果是这样,你能指出我正确的方向或给我任何指示吗?
与之前的 Beta 相比, Apple与 Yosemite 的 Beta 协议更加开放。我不认为我通过笼统地谈论这个违反了我的 Beta NDA,但实际使用的代码NSVisualEffectView
可能需要在 NDA 下共享......