2012-07-31 15 views
19

Tengo un CALayer y quiero agregarle una imagen extensible. Si acabo de hacer:¿Cómo agregar UIImage estirable en CALayer.contents?

 _layer.contents = (id)[[UIImage imageNamed:@"grayTrim.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0, 15.0, 0.0, 15.0)].CGImage; 

no va a funcionar desde contentGravity por defecto de las capas es kCAGravityResize.

He leído que esto se puede lograr usando contentsCenter, pero parece que no puedo averiguar cómo exactamente usaría eso para lograr la imagen estirada en mi CALayer.

¡Todas las ideas son bienvenidas!

Horatiu

Respuesta

33

La respuesta a esta pregunta es esta. Digamos que tiene una imagen estirable que se extiende solo en ancho y tiene la altura fija (por razones de simplicidad).

La imagen es 31px ancho (15 píxeles de tamaño fijo - no se estira -, se estirará 1px)

Asumiendo que su capa es una subclase CALayer su método init debería tener este aspecto:

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     UIImage *stretchableImage = (id)[UIImage imageNamed:@"stretchableImage.png"]; 
     self.contents = (id)stretchableImage.CGImage; 

     self.contentsScale = [UIScreen mainScreen].scale; //<-needed for the retina display, otherwise our image will not be scaled properly 

     self.contentsCenter = CGRectMake(15.0/stretchableImage.size.width,0.0/stretchableImage.size.height,1.0/stretchableImage.size.width,0.0/stretchableImage.size.height); 
    } 
    return self; 
} 

según la documentación, el rectángulo contentsCenter debe tener valores entre 0-1.

Se establece por defecto en el rectángulo unitario (0.0,0.0) (1.0,1.0) lo que da como resultado que se escale toda la imagen. Si el rectángulo se extiende fuera del rectángulo de la unidad, el resultado no está definido.

Esto es todo. Es de esperar que alguien más lo encuentre útil y ahorrará tiempo de desarrollo.

+0

Lo encontré útil. ¡Gracias! – duci9y

+1

Es mejor usar la escala de la imagen. –

+6

La solución sugerida fallará en el iPhone 6 más si no hay una variante @ 3x de la imagen. Es mejor usar la propiedad de escala de la imagen. 'self.contentScale = strechableImage.scale' Entonces funcionará aunque no todas las variantes de la imagen (@ 2x @ 3x) estén presentes. –