ios uiimageview uiimage calayer

ios - Máscara UIImageView de tamaño arbitrario con máscara UIImage redimensionable



calayer (2)

Código actual:

self.backgroundImageView.image = [self.message imageOfSize:self.message.size]; // Random image, random size UIImage *rightBubbleBackground = [[UIImage imageNamed:@"BubbleRight"] resizableImageWithCapInsets:BubbleRightCapInsets resizingMode:UIImageResizingModeStretch]; CALayer *mask = [CALayer layer]; mask.contents = (id)[rightBubbleBackground CGImage]; mask.frame = self.backgroundImageView.layer.frame; self.backgroundImageView.layer.mask = mask; self.backgroundImageView.layer.masksToBounds = YES;

Esto no funciona correctamente Aunque se aplica la máscara, rightBubbleBackground no rightBubbleBackground tamaño correctamente para ajustarse a self.backgroundImageView , a pesar de que ha establecido el tamaño de los BubbleRightCapInsets ( BubbleRightCapInsets ).

Imagen original:

Imagen de la máscara ( rightBubbleBackground ):

Resultado:

Encontré esta respuesta, pero solo funciona para imágenes simétricas. Tal vez podría modificar esa respuesta para mi uso.


Tenía (parte de) el mismo problema, es decir, el contenido de la capa pixelada. Para mí, esto se solucionó estableciendo el contenido Valor de escala en el CALayer: por alguna razón, la escala predeterminada en CALayers siempre es 1.0, incluso en dispositivos Retina.

es decir

layer.contentsScale = [UIScreen mainScreen].scale;

Además, si está dibujando una forma con CAShapeLayer y se pregunta si sus bordes se ven un poco irregulares en los dispositivos Retina, intente:

shapeLayer.rasterizationScale = [UIScreen mainScreen].scale; shapeLayer.shouldRasterize = YES;


Estaba equivocado. Esa respuesta puede modificarse para que funcione con imágenes asimétricas. Trabajé en esa respuesta un poco y resolví mi propio problema.

El siguiente código hizo que mis inserciones de tapa funcionen para la capa de máscara:

mask.contentsCenter = CGRectMake(BubbleRightCapInsets.left/rightBubbleBackground.size.width, BubbleRightCapInsets.top/rightBubbleBackground.size.height, 1.0/rightBubbleBackground.size.width, 1.0/rightBubbleBackground.size.height);

Resultado: