NSWindow - grenzenloses, transparentes Fenster - flackernder Schatten beim Animieren der Fensterhöhe

8

Hier ist eine weitere NSWindow Frage ... Ich habe ein randloses Fenster, transparent, das auf diese Weise erstellt wird ...

%Vor%

... und viewFrameDidChange: ist definiert als ...

%Vor%

... das ist der einzige Weg, um richtiges NSWindow shadow zu haben. Mit anderen Worten, wenn sich die Fenstergröße ändert, muss ich display , setHasShadow:NO und setHasShadow:YES aufrufen, sonst wird der Fensterschatten verkrüppelt - er ist nicht um das ganze Fenster herum - nur ein Teil des Fensters, etc.

Das funktioniert, bis ich die Höhe animiere. Wenn die Höhe animiert ist, wird der Schatten korrekt neu berechnet und angezeigt, aber das gesamte Fenster & amp; Schatten flackert und es ist ziemlich hässlich.

Eine Idee, warum der Schatten flackert? Ich habe versucht, display , setHasShadow:NO/YES durch [self invalidateShadow] zu ersetzen, aber es funktioniert überhaupt nicht und Schatten wird falsch angezeigt.

Wie sollte man Fensterhöhe mit Schatten im randlosen / transparenten Fenster animieren, um Flimmern zu vermeiden?

Hier ist das Video des flackernden Schattens. Ссылка

    
robertvojta 22.04.2013, 08:45
quelle

2 Antworten

2

Die Schattenberechnung und Zeichnung ist eine sehr ressourcenintensive Operation. Ich würde daher nicht empfehlen, den Schatten jedes Mal ungültig zu machen und neu zu berechnen, wenn sich der Rahmen ändert. Außerdem hat NSWindowDelegate eine –windowDidResize: -Methode, also warum mit observer?

  1. Wie bekommen Sie Ihr Fenster in der Größe? Vielleicht hilft das Hinzufügen von NSResizableWindowMask zur Stilmaske des Fensters? Sie sollten es versuchen.

  2. Noch ein Vorschlag - überprüfen Sie, ob der Inhalt Ihres Fensters mit dem Fenster korrekt skaliert wird. Sie legen Ihr Fenster auf transparent fest. Wenn jedoch kein Inhalt im Fenster vorhanden ist, wird kein Schatten angezeigt. Sie können auch versuchen, Ihre Ansicht als Unteransicht zur contentView des vorhandenen Fensters hinzuzufügen, anstatt sie zu ersetzen.

Ich habe fast das gleiche Setup in meinem Projekt und ich kann sagen, dass der Schatten des Fensters korrekt angezeigt wird, wenn Sie die Größe des Fensters ändern.

P.S. Eine Empfehlung: Verlassen Sie sich bei der Initialisierungsmethode des Objekts nicht auf "self". Möglicherweise ist es noch nicht vollständig einsatzbereit. Init mit minimum, passe das Fenster an, nachdem es in deinem Controller erstellt wurde (zum Beispiel kannst du nicht sicher sein, dass setFrame: display bei korrekter Größe das erwartet, was du erwartest). Der Fehler, den du hast, könnte auch damit zusammenhängen.

    
UJey 01.05.2013, 20:14
quelle
2

Vielleicht ist es besser, Schatten am Anfang der Animation auszuschalten und wenn Sie fertig sind. Ändern Sie diese Einstellung nicht während der Animation. Ich dachte ich habe das auch mit anderen Fenstern gesehen.

    
Mike Lischke 22.04.2013 17:32
quelle

Tags und Links