在另一个NSView上绘制透明覆盖层,具体而言是WebView。

4
我需要在另一个NSView上绘制一个透明的覆盖层,具体来说是一个WebView。目标是显示一些带有半透明背景的通知文本。为了进行第一次实验,我创建了一个Overlay视图,它只显示一个绿色正方形:
class Overlay: NSView {
    override func drawRect(dirtyRect: NSRect) {
        NSColor.greenColor().setFill()
        NSBezierPath(rect: CGRect(x: 10, y: 10, width: 1000, height: 1000)).fill()
    }
}

然后,在我的代码中,我像这样实例化它们并添加它们:
webView = WebView(frame: bounds)
overlay = Overlay(frame: bounds)

addSubview(webView)
addSubview(overlay)

令我惊讶的是,这只适用于某些页面。例如,如果您转到https://twitter.com/screensavrninja,它会使整个页面变灰,并显示一个弹出式注销框。灰度和弹出式框都出现在绿色方块的上方。
为什么会这样?如何正确地创建覆盖层并使其保持在顶部?
1个回答

2
在AppKit中,子视图的顺序不一定决定它们绘制的顺序。
为了提高性能,Cocoa不会强制执行兄弟视图之间的裁剪,也不能保证当兄弟视图重叠时正确的无效和绘制行为。如果您希望一个视图在另一个视图的前面绘制,应该将前景视图作为后景视图的子视图(或后代)。
但是,如果您使视图支持层,它们会尊重顺序。因此,您可以尝试启用这个功能。
参考资料:Reference查看更多关于支持层的信息
否则,您可以使用子窗口来显示覆盖层。这样做的好处是可以扩展超出父视图的边界,并且在Cocoa中相当常见。请参阅NSWindow的文档

这个内容是关于屏幕保护程序的,所以,据我了解,另一个窗口是不可能的。我会研究一下层支持视图。 - pupeno
OS X屏幕保护程序是一种奇特的生物。祝你好运! - joerick
我不确定如何与NSView.subviews的文档保持一致: "当前视图充当每个子视图的父视图。 子视图的顺序可以被认为是从后到前,但这并不意味着无效和绘图行为。"哪个是正确的? - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接