it-swarm.com.de

Hinzufügen einer Unteransicht zur NSWindow-Titelleiste

Ich möchte eine benutzerdefinierte Windows-Symbolleiste erstellen, jedoch ohne eine tatsächliche NSToolbar zu verwenden (da diese sich in einigen Fällen nicht richtig für meine Anforderungen verhält und ich sie nicht so gestalten kann, wie ich es möchte). Daher muss ich der Symbolleiste eine Unteransicht hinzufügen Titelleiste des Fensters. Es sollte wie folgt aussehen: Screenshot of custom Toolbar

Ein möglicher Weg wäre:

[[[_window contentView] superview] addSubview:_titlebarView];

dies hat jedoch das Problem, dass eine Warnung für Yosemite (NSWindow warning: adding an unknown subview: <NSView: 0x608000122b20>) ausgegeben wird, sodass dies nicht der richtige Weg zu sein scheint.

Momentan füge ich die Symbolleistenansicht der Titelleistenansicht hinzu:

[[[_window standardWindowButton:NSWindowCloseButton]
    superview] addSubview:_titlebarView];

aber das fühlt sich auch falsch an.

Da meine App nur auf OS X 10.10 (Yosemite) ausgerichtet ist, kann ich nur Yosemite-APIs verwenden. Daher habe ich NSTitlebarAccessoryViewController überprüft und es erfolgreich geschafft, eine Unterklasse zu erstellen und diese mit der addTitlebarAccessoryViewController:-Methode von NSWindow zu verwenden. Bei diesem Ansatz bleibt ein Problem bestehen. Die möglichen Werte für layoutAttribute sind:

  • NSLayoutAttributeBottom
    Fügt die Ansicht am unteren Rand der Titelleiste des Fensters hinzu, wobei die Höhe der Ansicht beibehalten wird.
  • NSLayoutAttributeRight
    Fügt die Ansicht rechts von der Titelleiste des Fensters hinzu und schneidet die Ansicht auf die Höhe der Titelleiste.

Die NSLayoutAttributeBottom ist nicht für mich geeignet, da ich die Dinge ganz oben in der Titelleiste des Fensters positionieren muss (siehe Screenshot oben) und die Ampel zentrieren muss. NSLayoutAttributeRight wäre genau das, was ich brauche, aber ich finde keine Möglichkeit, die Höhe der Titelleiste zu erhöhen. Daher wird die Ansicht auf die Höhe der Titelleiste beschnitten, was sie für mich unbrauchbar macht. (Hinweis: Die Verwendung eines strukturierten Fensters und das Ändern des Inhaltsrahmens funktioniert nicht, da die tatsächliche Höhe der Titelleiste nicht geändert wird.)

Was ist der empfohlene Weg, um dies zu tun? Ich würde es vorziehen, die offiziellen APIs zu verwenden und den AccessoryViewController-Ansatz zu verwenden, wenn eine Ansicht möglich wäre, die größer als die Standardtitelleiste ist.

27
ePirat

es ist nur eine NSToolBar. In Yosemite wird die NSToolBar zur Titelleiste, wenn window.title.titleVisibility = .Hidden

6
zythum_朱一

WAYAppStoreWindow könnte das erreichen, wonach Sie suchen. Es wurde explizit erstellt, um die Warnung zu Unteransichten in Yosemite zu vermeiden, eine benutzerdefinierte Höhe für die Titelleiste des Fensters anzugeben und der Titelleiste Unteransichten hinzuzufügen.

4
Fabian

Vielen Dank @ePirat

Das Hinzufügen von Unteransichten zu ihrer Titelleistenansicht ist dasselbe wie dies tun würde

[[[_window standardWindowButton:NSWindowCloseButton] superview] addSubview:_customTitlebarView];
1
Huynh Inc

Weisen Sie Ihr Fenster der Selbstansicht zu. und fügen Sie dann die Unteransicht mit Rahmen später hinzu, um die erforderliche Funktionalität bereitzustellen

0
Abhi