2009-10-14 21 views
25

A menudo he leído que usar un CALayer en lugar de un UIImageView es un aumento del rendimiento cuando se trata de un uso intensivo de imágenes. Eso tiene sentido, porque UIImageView causa 3 copias de la imagen en la memoria, que es necesaria para la animación del núcleo. Pero en mi caso, no uso Core Animation.Mostrar una imagen o UIImage con un plano CALayer

¿Cómo puedo asignar un UIImage (o sus datos de imagen) a un CALayer y luego mostrarlo?

+6

¿Dónde has leído esto? UIViews en general son envoltorios livianos alrededor de CALayers, y no he visto mucha diferencia entre ellos en cuanto a la memoria o el rendimiento de la pantalla. Tampoco estoy seguro de si compro las 3 copias de una imagen en el argumento de la memoria. En cualquier caso, los CALayers son sin duda parte de Core Animation (por lo tanto, el prefijo de CA). –

Respuesta

54
UIImage* backgroundImage = [UIImage imageNamed:kBackName]; 
CALayer* aLayer = [CALayer layer]; 
CGFloat nativeWidth = CGImageGetWidth(backgroundImage.CGImage); 
CGFloat nativeHeight = CGImageGetHeight(backgroundImage.CGImage); 
CGRect  startFrame = CGRectMake(0.0, 0.0, nativeWidth, nativeHeight); 
aLayer.contents = (id)backgroundImage.CGImage; 
aLayer.frame = startFrame; 

o en un patio de recreo Swift (que tendrá que proporcionar su propia imagen PNG en el archivo de recursos de la Zona de juegos. Estoy usando el ejemplo de "FrogAvatar".)

//: Playground - noun: a place where people can play 
import UIKit 

if let backgroundImage = UIImage(named: "FrogAvatar") // you will have to provide your own image in your playground's Resource file 
{ 
    let height = backgroundImage.size.height 
    let width = backgroundImage.size.width 

    let aLayer = CALayer() 
    let startFrame = CGRect(x: 0, y: 0, width: width, height: height) 

    let aView = UIView(frame: startFrame) 
    aLayer.frame = startFrame 
    aLayer.contentsScale = aView.contentScaleFactor 
    aLayer.contents = backgroundImage.cgImage 
    aView.layer.addSublayer(aLayer) 
    aView // look at this via the Playground's eye icon 
} 

An image as the content of a CALayer embedded in a UIView

+0

gracias! ¿Por qué escribes (id) backgroundImage y no solo backgroundImage? ¿No debería el compilador reconocer que tienes un UIImage allí? ¿O no se reconoce la propiedad CGImage? Tal vez una importación faltante? –

+0

Lo probé. Sin embargo, falta lo más interesante: ¿Cómo conseguirlo en la pantalla? Quiero evitar un UIViews tanto como sea posible. –

+0

Tendrá que agregar CALayer como una subcapa de la capa de UIView. Cada capa no necesita su propia vista, pero la jerarquía de capas necesita residir en una vista en alguna parte para poder dibujarla en la pantalla. –

12

versión ARC requiere un reparto diferente:

self.myView.layer.contents = (__bridge id) self.myImage.CGImage; 
0
CALayer *layer = [[CALayer alloc] init]; 
layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"REWIFISocketOff"].CGImage); 
+0

Esta respuesta mejoraría significativamente si incluyera una explicación en lugar de solo el código –

Cuestiones relacionadas