Unregelmäßiges Verhalten bei Layer-unterstützten / Layer-Hosting-NSViews

8

Ich habe eine View-Hierarchie, die so aussieht:

Im Grunde genommen habe ich eine NSSsplitView mit einer Unteransicht, die eine Bildlaufansicht (für eine Tabellenansicht) sowie eine Fußzeilenansicht mit drei Unteransichten enthält. Einige wichtige Dinge zu beachten:

  • Verwendet das 10.8-Basis-SDK, kein automatisches Layout
  • Die Fensterinhaltsansicht, die geteilte Ansicht, die übergeordnete Ansicht der Bildlauf- und Fußzeilenansichten sowie die Bildlauf- und Fußzeilenansicht sind alle Layer-gestützt mit einem NSViewContentsRedrawOnSetNeedsDisplay Neuzeichnungsrichtlinie.
  • Die NSClipView der NSScrollView ist eine spezielle Unterklasse, die eine Ebenenhosting Ansicht ist und eine CAScrollLayer als Hintergrundebene verwendet.
  • Die Farbansicht ist eine einfache Layer-Backed-Ansicht mit einer Hintergrundfarbe.
  • Die Hintergrundansicht ist eine Layer-hosting Ansicht, die einen Sublayer mit der Eigenschaft contents für ein Bild enthält ( contentsCenter) ist auch festgelegt)
  • Die Inhaltsansicht ist eine Containeransicht mit Layer-Backed , die eine einzelne Unteransicht, eine benutzerdefinierte Layer-unterstützte -Knopfansicht (kein NSButton) enthält. .
  • Die Fußzeilenansicht überlappt die Bildlaufansicht um etwa 3 Pixel

Ich bekomme ziemlich unberechenbares Verhalten mit diesem Layout. Hier sind die drei verschiedenen Szenarien, die ich bekomme, die jedes Mal randomize, wenn ich die App starte.

1) Alles erscheint OK. Hintergrundansicht und alle Inhalte sind da:

2) Die Schaltfläche erscheint gut, aber die Hintergrundansicht scheint teilweise transparent zu sein:

3) Die Hintergrundansicht wird richtig angezeigt, aber die Schaltfläche ist nicht mehr verfügbar:

Es gibt absolut keinen Code, der sich zwischen jedem dieser Szenarien ändert. Ich höre einfach auf und starte die App erneut. Ich habe sichergestellt, dass ich nichts zur Opazität zur Laufzeit ändere. Das einzige, was ich zur Laufzeit mache, sind die Hintergrundfarben und Bilder auf den Ansichten.

BEARBEITEN: Ich hatte das Gefühl, dass die überlappenden Ansichten Probleme verursachen könnten. Daher habe ich ohne Überlappung getestet und die gleichen Ergebnisse erzielt.

BEARBEITEN 2: Dies scheint ein Problem mit zPosition der Ebenen der Layer-Backed-Ansichten zu sein. Die Reihenfolge ist verschlüsselt und zufällig. Wenn ich die zPosition der Ebenen manuell auf die richtigen Werte erzwinge, damit sie der Unteransichtsreihenfolge entsprechen, ist alles in Ordnung. Leider kann ich keinen saubereren Weg finden, dies zu tun, als nur zPosition zu setzen.

    
indragie 06.01.2013, 20:02
quelle

1 Antwort

2

Dies scheint ein OS X Bug zu sein. Ein Radar wurde archiviert . In der Zwischenzeit ist hier die beste Problemumgehung, die ich gefunden habe (wobei view die Superansicht aller Geschwisteransichten ist):

view.subviews = [view.subviews copy]

Durch das Auslösen des Setters für subviews wird das richtige zPosition auf den Ansichtslayern festgelegt.

    
indragie 30.03.2013, 20:36
quelle