2009-06-07 14 views
5

Ecco il mio setup: ho un CALAyer a cui voglio aggiungere i sottolivelli. Creo questi sottolivelli impostando upa UILabel e quindi aggiungendo il livello UILables al mio livello principale. Ovviamente questo lascia il pesante oggetto UILabel che si aggira sullo sfondo. È possibile ottenere il livello con tutto il suo contenuto da un UIView e sbarazzarsi dello stesso UIView? già provato questo:È possibile copiare CALayer da UIView?

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

Ma quando rilascio l'UIView, il contenuto del livello viene anche rimosso. È ancora possibile o il layer di UIView ha sempre bisogno dello stesso UIView per mostrare il suo contenuto? Ho pensato allo strato come una sorta di tela, a cui dipinge l'UIView. Credo che potrei sbagliarmi con questa ipotesi :)

risposta

1

Non è possibile: un livello è una proprietà di un UIView. Pertanto, quando si rilascia UIView, il suo livello è scomparso. La tua idea di pensare allo strato come una sorta di tela non è sbagliata. Ma il livello è parte integrante del suo UIView.

4

Non riesco a capire perché non sia possibile copiare un livello. Vero un livello è una "parte integrante" di un UIView. Ma alla fine è solo un altro oggetto con diverse proprietà.

in realtà c'è un metodo per CALayer chiamato:

- (id)initWithLayer:(id)layer 

Ma non è destinato a fare una copia di un livello. (Potete leggere documenti di Apple per il ragionamento perché)

CALayer non è conforme alla NSCopying, in modo da avere due opzioni:

  1. sottoclasse e implementare "copyWithZone:" (e conformarsi alle NSCopying)
  2. Scrivere un metodo/funzione che restituire una "copia" di un CALayer

Indipendentemente da quale modo si sceglie, la domanda che bisogna porsi è: quali proprietà del CALlayer vuoi copiare?

Diciamo che si desidera copiare solo il contenuto e la struttura:

CALayer copyLayer = [CALayer layer]; 

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

return copyLayer; 

Si potrebbe passare attraverso e copiare ogni proprietà dello strato, o semplicemente copiare quelle che ti servono. Potrebbe essere un buon metodo per inserire una categoria CALayer.

+1

Forse perché lo scopo di uno strato è quello di rendere la sua UIView associata ed i suoi sottolivelli. Se l'UIView scompare perché lo rilasci, perché dovresti utilizzare un livello originariamente legato a tale UIView? Se hai davvero bisogno di un livello mi sembra logico che tu abbia bisogno anche del suo UIView.Haentz potrebbe certamente provare l'approccio suggerito (e non sono sicuro che funzionerà), ma non l'ho mai visto prima nel codice dell'anima core. Inoltre, se Apple avesse pensato di renderlo possibile, avrebbe reso CALayer compatibile con NSCopying. Per favore fatemi sapere se questo approccio funziona o no. –

+0

L'unica ragione che posso vedere per copiare un CALayer è se avesse bisogno di visualizzare multipli dello stesso livello sullo schermo. Penso che di solito si andrebbe a creare più livelli nello stesso modo in cui è stato creato il primo. Anche se, non vedo perché ne faresti una copia se intendessi distruggere il primo. Pensavo che non avesse davvero bisogno di una "copia" tanto quanto aveva bisogno di un livello con le stesse proprietà dell'originale. Hai ragione perché probabilmente non è la soluzione accettata al problema, ma è interessante vedere come funziona. –

0

UILabel non è davvero un controllo molto complesso. Ti suggerisco di abbandonare questa linea di attacco e imparare come disegnare ciò che vuoi usando Quartz in un nuovo CGImage. È quindi possibile assegnare questo alla proprietà dei contenuti del CALayer senza doversi preoccupare di tutte queste altre cose.

0

È inoltre possibile eludere completamente UILabel e creare il testo con un CATextLayer.

0

uso CAReplicatorLayer, si sarà in grado di replicare completamente quello strato

Problemi correlati