Darf Layer-Hosting-NSViews Subviews haben?

7

Layer-Hosting NSViews (also NSViews, für die Sie eine CALayer-Instanz bereitstellen und mit setLayer: einstellen) können natürlich Subviews enthalten. Warum offensichtlich? Denn in Apples eigenem Cocoa Slides-Beispielcode-Projekt , können Sie ein Kontrollkästchen aktivieren, das den Layer AssetCollectionView von Layer-Backed auf Layer-Hosting umschaltet:

%Vor%

In derselben AssetCollectionView -Klasse werden Unteransichten für jedes Bild hinzugefügt, das angezeigt werden soll:

%Vor%

Wenn ich die App baue und starte und damit herumspiele, scheint alles in Ordnung zu sein.

Jedoch in Apples NSView-Klassenreferenz für die Methode setWantsLayer: lautet:

  

Wenn Sie eine Layer-Hosting-Ansicht verwenden, sollten Sie sich nicht auf die Ansicht für verlassen   Zeichnen, noch sollten Sie Subviews zur Layer-Hosting-Ansicht hinzufügen.

Was ist wahr? Ist der Beispielcode falsch und es funktioniert nur zufällig? Oder ist die Dokumentation falsch (was bezweifle ich)? Oder ist es in Ordnung, weil die Unteransichten über den Animator-Proxy hinzugefügt werden?

    
Johannes Fahrenkrug 23.05.2012, 11:54
quelle

3 Antworten

19

Wenn AppKit "Layer-Hosting" ist, nehmen wir an, dass Sie möglicherweise (oder auch nicht) eine ganze Untergruppe von Layern haben, von denen AppKit nichts weiß.

Wenn Sie der Layer-gehosteten Ansicht eine Unteransicht hinzufügen, wird sie möglicherweise nicht in der richtigen nachgeordneten Reihenfolge angezeigt. Außerdem fügen wir sie manchmal hinzu und entfernen sie, so dass sie sich abhängig davon ändern können, ob Sie setLayer :, setWantsLayer aufrufen: oder wenn die Ansicht der Superansicht hinzugefügt oder aus ihr entfernt wird. Auf Lion (und davor) entfernen wir die Layer, die wir besitzen (dh: Layer-Backed), wenn die Ansicht aus dem Fenster (oder Superview) entfernt wird.

Es ist in Ordnung Subviews hinzuzufügen ... ihre Children-Geschwister-Reihenfolge im Sublayer-Array ist möglicherweise nicht deterministisch, wenn Sie Geschwister-Layer haben, die keine NSViews sind.

    
corbin dunn 23.05.2012, 23:24
quelle
1

Ich weiß nicht, was die "richtige" Antwort darauf ist. Aber ich denke, dass das CocoaSlides-Beispiel innerhalb der Grenzen dessen arbeitet, was die Dokumente sagen, dass Sie "nicht tun sollten". Im Beispiel sehen Sie, wo die Methode insertNodeForAssetAtIndex: aufgerufen wird, und Sie sehen, dass sie nur auftritt, wenn die Ansicht gefüllt wird, bevor ihr jemals eine Ebene zugewiesen wurde oder setWantsLayer: called hat darauf.

In den Dokumenten heißt es nicht, dass eine von einer Ebene gehostete Ansicht keine Unteransichten enthalten darf. Sie sagen lediglich, dass Sie keine hinzufügen und Unteransichten hinzufügen können. Zu dem Zeitpunkt, zu dem diese Unteransichten hinzugefügt werden, ist die Hauptansicht noch keine Schicht-Hosting-Ansicht geworden. Nachdem es in eine Layer-Hosting-Ansicht umgewandelt wurde, indem ihm eine manuell erstellte Ebene zugewiesen wurde, werden keine weiteren Unteransichten hinzugefügt.

Es gibt also wirklich keinen Widerspruch zwischen den Dokumenten und diesem bestimmten Beispiel. Davon abgesehen könnte es interessant sein, dies weiter zu untersuchen, möglicherweise durch Einschalten der QC-Hintergrundschicht von Anfang an, z. indem Sie [self setUsesQuartzCompositionBackground:YES]; rechts innerhalb initWithFrame: festhalten.

SPOLIER ALERT: Es scheint gut zu funktionieren. Die Erstellung des Displays ist ein bisschen langsamer (nicht überraschend mit all den QC-Animationen), aber ansonsten ist das Segeln fließend.

    
Jack Nutting 23.05.2012 13:05
quelle
0

Ein Kommentar zu diesem Code von Apple: Es ist kaputt.

Wenn Sie die App zum ersten Mal starten, notieren Sie sich den schönen Hintergrund mit Farbverlauf. Schalten Sie QC ein und dann aus.

Poof, kein Farbverlaufshintergrund mehr.

    
zzyzy 20.09.2013 17:49
quelle