2008-10-31 7 views
5

Ich habe ein Fenster, das ein NSBox-Steuerelement enthält. In diesem NSBox sind mehrere andere Steuerelemente, (Popups, Textfelder, etc ...)Layer Backed Views und Flackern Kontrollen

Ich habe zwei andere NSBox in der gleichen NIB-Datei, die mit Steuerelementen gefüllt sind, die ich mit der ersten unter bestimmten austauschen möchte Bedingungen. Ich möchte dies mit einem schönen Cross-Fade-Effekt passieren, so dass ich wie folgt vorgehen:

Im -awakeFromNib Methode des NSWindowController:

[[self.myWindow contentView] setWantsLayer:YES]; 

In meiner Methode, wo ich die Ansichten bin Schale ich diesen Code verwenden :

[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView]; 

Das funktioniert gut, die Ansichten überblenden genau so, wie ich es erwarten würde. Das Problem besteht darin, dass die Steuerelemente in den Ansichten manchmal ohne ersichtlichen Grund verschwinden. Es sind nicht immer die gleichen Ansichten (obwohl die NSPopUpButtons besonders anfällig dafür sind), und sie erscheinen normalerweise wieder, wenn sie den Fokus haben.

Muss ich auch alle Steuerelemente sichern?


Update: Wrapping der Animation in expliziter Gruppierung machte keinen Unterschied. Das Aktivieren von setWantsLayer in der Nib-Datei hat ebenfalls keinen Unterschied gemacht, aber das Interessante daran ist, dass die NSPopup-Schaltflächen verschwinden, wenn auf ihre enthaltene Ansicht geklickt wird. Das manuelle Festlegen der Layer auf den NSPopup-Tasten hat ebenfalls keinen Unterschied gemacht.

Es scheint, dass andere dieses Problem gehabt haben, aber ich kann keine Lösungen geschrieben finden:

http://www.cocoabuilder.com/archive/message/cocoa/2008/3/30/202691 http://www.cocoabuilder.com/archive/message/cocoa/2008/4/25/205134

+0

Ich hatte auch dieses Problem mit NSPopUpButtons und CALayers und habe keine anständige Lösung gefunden. –

Antwort

4

Wenn eine Ansicht Schicht alle seine Subviews sein gesichert ist, wird Schicht gesichert, so dass Sie Sie müssen sie nicht manuell als Layer-Backed festlegen. Ich weiß nicht, ob es genug Informationen, um zu sehen, was hier los ist, aber ich wäre neugierig, wenn Sie ein anderes Verhalten, wenn man die Animation in einer explict Gruppierung wickeln:

[NSAnimationContext beginGrouping]; 
[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView]; 
[NSAnimationContext endGrouping]; 
Auch

gibt es eine Grund, warum Sie setWantsLayer aufrufen: in awakeFromNib statt nur in der nib (es sollte ein Kontrollkästchen im NSView Inspektor sein).