15 Stimmen

Können wir Popovers in Mac Cocoa-Anwendungen haben?

Popovers werden häufig in iPad-Apps verwendet und ich mag sie sehr. Jetzt denke ich darüber nach, wie dies in AppKit auf dem Mac implementiert werden könnte, weil ich einen Anwendungsfall dafür habe.

Brauche ich eine NSWindow-Unterklasse, um die Überlagerung zu erreichen, oder könnte ich auch eine normale Ansicht verwenden?

22voto

Sam Spencer Punkte 8402

Nach Angaben von Apples Dokumentation für Entwickler können Sie unter OS X mit der eingebauten Klasse NSPopover eingebaute Popovers verwenden:

Ab OS X v10.7 bietet AppKit mit der Klasse NSPopover Unterstützung für Popover. Ein Popover bietet die Möglichkeit, zusätzliche Inhalte in Verbindung mit vorhandenen Inhalten auf dem Bildschirm anzuzeigen. Die Ansicht, die den vorhandenen Inhalt enthält und aus der das Popover hervorgeht, wird in diesem Zusammenhang als Positionierungsansicht bezeichnet. Sie verwenden einen Anker, um die Beziehung zwischen einem Popover und seiner Positionierungsansicht auszudrücken.

Hier ist ein Link zum NSPopover-Klasse . Sie können auch ein Beispiel für NSPopovers sehen, das in der Kalender-App (10.7+) und der Safari-App (10.8+) verwendet wird. Das Bild unten zeigt ein Popover in der Kalender-App (links) und in Safari (rechts):

Use of NSPopover in Mac OS X


Hier wird beschrieben, wie man einen NSPopover einrichtet. Es ist sehr einfach und kann größtenteils im Interface Builder erledigt werden.

  1. Fügen Sie ein NSPopover Item zu Ihrer XIB im Interface Builder hinzu. Dadurch werden der NSPopover und sein View-Controller erstellt.

  2. Als nächstes ziehen Sie eine benutzerdefinierte NSView über den Interface Builder in Ihre XIB. Dies wird die Ansicht für den Popover View Controller sein

  3. Passen Sie Ihre NSView mit allen Steuerelementen an, die Sie in Ihrem Popover benötigen

  4. Fügen Sie in Ihrer Header-Datei (.h) die folgenden zwei Codezeilen ein:

    @property (assign) IBOutlet NSPopover *popover;
    - (IBAction)showPopover:(id)sender;

    Vergessen Sie nicht, sowohl die Steckdose als auch die Aktion mit Ihrer Schnittstelle zu verbinden.

  5. Synthetisieren Sie in Ihrer Implementierung das Popover und fügen Sie die Methode für showPopover

  6. In der showPopover Methode fügen Sie diese Zeile hinzu, um das Popover anzuzeigen:

    [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxYEdge];

Es liegt an Ihnen, herauszufinden, wie Sie das Popup-Fenster schließen können, denn was macht es schon, zu kopieren oder einzufügen? Sie können es entweder manuell tun (Tipp: Versuchen Sie es mit close ) oder ändern Sie die behavior Eigenschaft und lassen Sie das System dies tun (siehe untenstehende Bearbeitung).

Viel Glück, ich hoffe, das hilft!


Modifier

Wie bereits von David in seinem Kommentar :

Eine weitere Möglichkeit, das Popover zu schließen, besteht darin, sein Verhalten auf Vorübergehend . So kann der Benutzer auf eine beliebige Stelle außerhalb des Popovers klicken, damit es verschwindet

Die Verhaltenseigenschaft eines Popovers legt fest, wie es erscheint und verschwindet. Es gibt drei Verhaltensweisen:

  • NSPopoverBehaviorApplicationDefined - (Standard) Ihre Anwendung muss das Popover selbst schließen
  • NSPopoverBehaviorTransient - Das Popover wird geschlossen, wenn außerhalb des Popovers mit einem Oberflächenelement interagiert wird
  • NSPopoverBehaviorSemitransient - Das Popover wird geschlossen, wenn ein beliebiges Schnittstellenelement der Popover-Ansicht außerhalb des Popovers interagiert wird.

Lesen Sie mehr darüber in Apples Dokumentation .

12voto

Wenn ich Sie richtig verstanden habe, wollen Sie etwas wie MAAttachedWindow (von Matt Gemmell), das quelloffen ist.

MAAttachedWindow

4voto

Ivan Vučica Punkte 9394

Alternativ können Sie auch einen Blick auf Popover Beispiel in der Dokumentation. https://developer.apple.com/library/mac/samplecode/Popover/Introduction/Intro.html enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X