2009-06-07 8 views
5

Hier ist mein Setup: Ich habe einen CALAyer, dem ich Sublayer hinzufügen möchte. Ich erstelle diese Sublayer, indem ich upa UILabel einstelle und dann die UI-Ebenen-Ebene zu meiner Haupt-Ebene hinzufüge. Natürlich bleibt das schwere UILabel-Objekt im Hintergrund. Ist es möglich, die Ebene mit ihrem gesamten Inhalt von einer UIView abzurufen und die UIView selbst loszuwerden? Ich habe bereits versucht, diese:Kann CALayer von UIView kopiert werden?

UILabel* label; 
[...] 
[mainLayer addSublayer:[label.layer copy]]; 
[label release]; 

Aber immer, wenn ich die UIView loslassen, wird der Inhalt der Schicht ebenfalls entfernt. Ist das überhaupt möglich oder benötigt die UIView-Ebene immer den UIView selbst, um den Inhalt anzuzeigen? Ich habe mir die Ebene als eine Art Leinwand vorgestellt, die die UIView malt. Ich glaube, ich könnte mit dieser Annahme falsch liegen :)

Antwort

1

Es ist nicht möglich: Eine Schicht ist eine Eigenschaft eines UIView. Wenn Sie die UIView freigeben, ist ihre Ebene daher nicht mehr vorhanden. Ihre Idee, die Ebene als eine Art Leinwand zu betrachten, ist nicht falsch. Die Ebene ist jedoch ein wesentlicher Bestandteil ihrer UIView.

4

Ich kann nicht verstehen, warum Sie eine Schicht nicht kopieren könnten. Eine Ebene ist ein "integraler Bestandteil" einer UIView. Aber am Ende ist es nur ein anderes Objekt mit mehreren Eigenschaften.

Eigentlich ist es ein Verfahren zum CALayer genannt:

- (id)initWithLayer:(id)layer 

Aber es ist nicht eine Kopie einer Schicht machen soll. (Sie können Dokumente von Apple die Begründung lesen, warum)

CALayer entspricht nicht NSCopying, so haben Sie zwei Möglichkeiten:

  1. es Subclass und implementieren "copyWithZone:" (und entsprechen NSCopying)
  2. schreiben Sie eine Methode/Funktion, die eine „Kopie“ eines ist CALayer

Unabhängig davon, welche Art und Weise Sie sich entscheiden, die Frage, die Sie stellen müssen, wird zurück: Welche Eigenschaften des CALlayer willst du kopieren?

Angenommen, Sie haben nur den Inhalt und Rahmen kopieren möchten:

CALayer copyLayer = [CALayer layer]; 

copyLayer.contents = theLayerToBeCopied.contents; 
copyLayer.frame = theLayerToBeCopied.frame; 

return copyLayer; 

Sie könnten durch gehen und jede Eigenschaft der Schicht kopieren, oder kopieren Sie einfach die, die Sie benötigen. Könnte eine gute Methode sein, in eine CALayer-Kategorie einzusteigen.

+1

Vielleicht, weil der Zweck einer Schicht seiner zugehörigen UIView und seine Unterschichten zu machen. Wenn die UIView verschwindet, weil Sie sie freigeben, warum sollten Sie dann eine Ebene verwenden, die ursprünglich an diese UIView gebunden war? Wenn Sie wirklich eine Ebene benötigen, erscheint es mir logisch, dass Sie auch ihre UIView benötigen.Haentz kann sicherlich versuchen, den Ansatz, den Sie vorgeschlagen haben (und ich bin mir nicht sicher, ob es funktionieren wird), aber ich habe das noch nicht in Core Animation Code gesehen. Wenn Apple darüber nachgedacht hätte, dies zu ermöglichen, hätte es CALayer mit NSCopying kompatibel gemacht. Bitte lassen Sie mich wissen, ob dieser Ansatz funktioniert oder nicht. –

+0

Der einzige Grund, den ich sehen kann, um einen CALayer zu kopieren, ist, wenn er ein Vielfaches derselben Ebene auf dem Bildschirm anzeigen muss. Ich denke, normalerweise würden Sie einfach die mehreren Ebenen erstellen, so wie Sie die erste erstellt haben. Obwohl ich nicht sehe, warum Sie eine Kopie machen würden, wenn Sie beabsichtigten, das erste entweder zu zerstören. Mein Gedanke war, dass er nicht wirklich eine "Kopie" brauchte, da er eine Schicht mit den gleichen Eigenschaften wie das Original brauchte. Du hast Recht, da es wahrscheinlich nicht die akzeptierte Lösung des Problems ist, aber interessant zu sehen, wie es funktioniert. –

0

UILabel ist wirklich keine sehr komplexe Steuerung. Ich schlage vor, dass Sie diese Angriffslinie aufgeben und lernen, wie Sie zeichnen, was Sie wollen, indem Sie Quartz in ein neues CGImage einfügen. Sie können dies dann der contents -Eigenschaft des CALayers zuweisen, ohne sich um all diese anderen Dinge kümmern zu müssen.

0

Sie können UILabel auch komplett umgehen und Ihren Text mit einer CATextLayer erstellen.

0

Verwendung CAReplicatorLayer, können Sie vollständig, dass die Schicht replizieren

Verwandte Themen