/ / Zeichnen Sie ein transparentes Overlay über ein anderes NSView, insbesondere ein WebView - object-c, macos, cocoa, swift, nsview

Zeichnen Sie ein transparentes Overlay über ein anderes NSView, speziell ein WebView - objective-c, macos, cocoa, swift, nsview

Ich muss ein transparentes Overlay über ein anderes zeichnenNSView, insbesondere eine WebView. Ziel ist es, einen Benachrichtigungstext mit halbtransparentem Hintergrund anzuzeigen. Für mein erstes Experiment habe ich eine Überlagerungsansicht erstellt, in der nur ein grünes Quadrat angezeigt wird:

class Overlay: NSView {
override func drawRect(dirtyRect: NSRect) {
NSColor.greenColor().setFill()
NSBezierPath(rect: CGRect(x: 10, y: 10, width: 1000, height: 1000)).fill()
}
}

und dann, in meinem Code, instanziiere ich sie und füge sie so hinzu:

webView = WebView(frame: bounds)
overlay = Overlay(frame: bounds)

addSubview(webView)
addSubview(overlay)

Zu meiner Überraschung funktioniert das nur bei einigen Seiten. Zum Beispiel, wenn Sie zu gehen https://twitter.com/screensavrninjawird die gesamte Seite grau hinterlegt und ein Pop-In für die Abmeldung wird angezeigt. Sowohl das Grauwerden als auch das Pop-In finden auf dem grünen Quadrat statt.

Warum passiert das? Was ist der richtige Weg, um eine Überlagerung zu haben und sie oben zu behalten?

Antworten:

0 für die Antwort № 1

In AppKit bestimmt die Reihenfolge der Unteransichten nicht notwendigerweise die Reihenfolge, in der sie gezeichnet werden.

Aus Leistungsgründen erzwingt Cocoa keine DurchsetzungSchneiden Sie zwischen den gleichen Ansichten, oder gewährleisten Sie das korrekte Ungültigmachen und Zeichnen, wenn sich die gleichen Ansichten überschneiden. Wenn Sie möchten, dass eine Ansicht vor einer anderen Ansicht gezeichnet wird, sollten Sie die Vorderansicht zu einer Unteransicht (oder Nachkommen) der Rückansicht machen.

Referenz

Wenn Sie jedoch die Ansichtsebene hinterlegt haben, können Sie sie verwenden respektieren Sie die Bestellung. Sie könnten also versuchen, das zu aktivieren.

Ansonsten könnten Sie ein untergeordnetes Fenster verwenden, um die Überlagerung anzuzeigen. Dies hat den Vorteil, dass es über die Grenzen des Elternteils hinausgehen kann, und ist in Kakao ziemlich üblich. Siehe die Dokumentation für NSWindow.