在另一个NSView上绘制透明覆盖,特别是WebView

时间:2015-04-10 10:06:47

标签: objective-c macos cocoa swift nsview

我需要在另一个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 个答案:

答案 0 :(得分:0)

在AppKit中,子视图的顺序不一定决定它们的绘制顺序。

  

出于性能原因,Cocoa不会在兄弟视图之间强制执行剪切,或者在兄弟视图重叠时保证正确的失效和绘制行为。如果要在另一个视图前绘制视图,则应将前视图设为后视图的子视图(或后代)。

Reference

但是,如果您使视图层支持,则respect the ordering。所以你可以尝试启用它。

否则,您可以使用子窗口显示叠加层。这样做的优点是能够超出父级的范围,并且在Cocoa中相当普遍。请参阅documentation for NSWindow