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: