2009-06-07 17 views
5

Aquí está mi configuración: tengo una CALAyer a la que quiero agregar subcapas. Creo estas subcapas estableciendo upa UILabel y luego agregando la capa de UILables a mi capa principal. Por supuesto, esto deja el pesado objeto UILabel flotando en el fondo. ¿Es posible obtener la capa con todo su contenido desde una UIView y deshacerse de la misma UIView? ya he intentado esto:¿Es posible copiar CALayer de UIView?

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

Pero cada vez suelto el UIView, el contenido de la capa también se elimina. ¿Es esto posible o la capa de UIView siempre necesita la propia UIView para mostrar su contenido? Pensé en la capa como un tipo de lienzo, al que pinta UIView. Supongo que podría estar equivocado con esta suposición :)

Respuesta

1

No es posible: una capa es propiedad de UIView. Por lo tanto, cuando liberas UIView, su capa ya no está. Tu idea de pensar en la capa como una especie de lienzo no es incorrecta. Pero, la capa es una parte integral de su UIView.

4

No entiendo por qué no podría copiar una capa. Es cierto que una capa es una "parte integral" de una UIView. Pero al final es solo otro objeto con varias propiedades.

En realidad no es un método para CALayer llamada:

- (id)initWithLayer:(id)layer 

Pero no tiene la intención de hacer una copia de una capa. (Puede leer documentos de Apple para el razonamiento de por qué)

CALayer no se ajusta a NSCopying, por lo que tiene dos opciones:

  1. subclase e implementar "copyWithZone:" (y ajustarse a NSCopying)
  2. Escriba un método/función que devolver una "copia" de un CALayer

Independientemente de la forma que elija, la pregunta que hay que hacerse es: ¿Qué propiedades de la ¿CALlayer quieres copiar?

Digamos que desea copiar sólo el contenido y el marco:

CALayer copyLayer = [CALayer layer]; 

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

return copyLayer; 

Se podía ir a través y copiar todas las propiedades de la capa, o simplemente copiar los que necesita. Puede ser un buen método para poner en una categoría CALayer.

+1

Tal vez porque el propósito de una capa es hacer que su UIView asociada y sus subcapas. Si UIView desaparece porque lo liberaste, ¿por qué necesitarías usar una capa que originalmente estaba vinculada a esa UIView? Si realmente necesita una capa, me parece lógico que también necesite su UIView.Es probable que Haentz pruebe el enfoque que sugirió (y no estoy seguro si funcionará), pero no lo he visto antes en el código de Core Animation. Además, si Apple pensó en hacer esto posible, habría hecho que CALayer cumpliera con NSCopying. Por favor, avíseme si este enfoque funciona o no. –

+0

La única razón por la que puedo ver para copiar un CALayer es si necesitaba mostrar múltiples capas de la misma capa en la pantalla. Creo que normalmente solo crearás las capas múltiples de la misma forma que creaste la primera. Aunque, no veo por qué harías una copia si tu intención era destruir la primera tampoco. Mi pensamiento era que realmente no necesitaba una "copia" tanto como necesitaba una capa con las mismas propiedades que el original. Tienes razón, ya que probablemente no sea la solución aceptada para el problema, pero es interesante ver cómo funciona. –

0

UILabel realmente no es un control muy complejo. Te sugiero que renuncies a esta línea de ataque y aprendas a dibujar lo que quieras usando Quartz en una nueva CGImage. A continuación, puede asignar esto a la propiedad de contenido del CALayer sin tener que preocuparse por todas estas otras cosas.

0

También puede sortear UILabel por completo y crear su texto con un CATextLayer.

0

uso CAReplicatorLayer, usted será capaz de replicar por completo esa capa

Cuestiones relacionadas