2009-05-26 18 views
0

Ich arbeite an einem Cocoa-Projekt mit Core Animation und ich habe eine benutzerdefinierte Ansicht, die in zwei Fenstern angezeigt wird. Es erscheint immer in einem Fenster, aber manchmal erscheint es nicht im anderen Fenster, wenn ich die Anwendung starte. Soweit ich das beurteilen kann, ist es völlig zufällig. Hier ist der Code, den ich aufruft, wenn die Ansicht initialisiert wird. Es kommt zu diesem Code, ob die Ansicht angezeigt wird oder nicht.Core Animation-Ansicht wird manchmal nicht angezeigt

[self setWantsLayer:YES]; 

root = [self layer]; // root is a CALayer 

root.layoutManager = [CAConstraintLayoutManager layoutManager]; 
root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; 

[root setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)]; 

[self setNeedsDisplay:YES]; 

Warum sollte die Ansicht manchmal angezeigt werden und andere nicht?

BEARBEITEN: Würde es einen Unterschied machen, wenn ich den root CALayer selbst erstellen würde, anstatt ihn auf die "Ebene" der Ansicht zu setzen, wie ich es gerade tue?

Antwort

1

Sieht so aus als gäbe es eine ziemlich einfache Lösung, aber es war nicht gut dokumentiert. Anstatt root auf den Layer der untergeordneten Ansicht zu setzen, erstelle ich root als neuen CALayer und setze dann den Layer der Ansicht auf root. Der Code von der ursprünglichen Frage sieht nun wie:

// self is the sub-classed NSView 
[self setWantsLayer:YES]; 

// Set root to a new CALayer 
root = [CALayer layer]; 

root.layoutManager = [CAConstraintLayoutManager layoutManager]; 
root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; 

[root setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)]; 

// Set the view's layer to root 
[self setLayer:root]; 

Ich denke, dass manchmal, wenn mein Code für die Initialisierung genannt wurde, hatte sich die Ansicht, die die Schicht mit sich selbst verbunden sind, nicht initialisiert, so wurde root nicht richtig zugewiesen bekommen. Dies ist nur eine Vermutung, aber die obigen Änderungen haben mein Problem mit der Ansicht nicht immer angezeigt.

0

Wenn Sie sagen, dass es in zwei Fenstern angezeigt wird, meinen Sie, dass es zwei Instanzen der Klasse der Ansicht gibt, die sich in zwei Fenstern befinden, oder meinen Sie, dass Sie versucht haben, die gleiche Ansichtsinstanz in zwei zu setzen Fenster? Eine bestimmte Ansicht kann nur Teil einer einzelnen Ansichtshierarchie sein. Wenn Sie es in eins installieren, wird es aus der Hierarchie entfernt, in der es sich befand.

+0

Es gibt zwei Instanzen derselben benutzerdefinierten (untergeordneten) Ansicht, eine in jedem Fenster. Sie wurden erstellt, indem Sie eine benutzerdefinierte Ansicht in das Fenster in Interface Builder ziehen und dann die benutzerdefinierte Klasse für jede festlegen. – Austin