Cómo evitar el recorte de la máscara UIImageView

Quiero aplicar una máscara de burbuja de chat a una vista de image, y me gustaría que la image de la máscara se ajuste a escala en el marco de la vista de la image. Este es el código que estoy usando para crear y aplicar la máscara:

let mask = CALayer() let maskImage = UIImage(named: "chatGif")! mask.contents = maskImage.CGImage mask.frame = CGRectMake(0, 0, imageView.frame.width, imageView.frame.height) imageView.layer.mask = mask imageView.layer.masksToBounds = true 

Y esta es mi máscara:

introduzca la descripción de la imagen aquí

Sin embargo, esto es lo que obtengo:

introduzca la descripción de la imagen aquí

Y cuando agrego slicing a la image de la máscara (es decir, creo inserciones de casquillo networkingimensionable) obtengo esto:

introduzca la descripción de la imagen aquí

Hice un proyecto mínimo que demuestra el problema y lo pongo aquí

No entiendo fundamentalmente por qué los lados derecho e inferior de la image de mi máscara están siendo ocultados fuera de la vista. El marco y los límites de la máscara coinciden con los de la vista de la image, y la image utilizada para la máscara es en realidad más pequeña que la vista de la image, así que, en todo caso, espero que no cubra todo, en lugar de recortarse parcialmente.

¿Alguien puede explicar qué está pasando aquí? ¿Cómo evito este comportamiento?

EDITAR: He estado jugando con esto un poco más, y los resultados tienen un poco más de sentido cuando configuro el tamaño de la máscara para que coincida con el tamaño de la máscara de maskImage la maskImage manera:

 let mask = CALayer() let maskImage = UIImage(named: "chatGif")! mask.contents = maskImage.CGImage mask.frame = CGRectMake(0, 0, maskImage.size.width, maskImage.size.height) imageView.layer.mask = mask imageView.layer.masksToBounds = true 

Esto me da:

introduzca la descripción de la imagen aquí

O con cortar el recurso de máscara, obtengo la image en la respuesta de J. Hunter . Esto todavía no es lo que quiero porque la máscara no se está estirando para llenar el imageView y una gran parte alnetworkingedor de los lados está enmascarada que no debería ser, pero al less puedo entender lo que está sucediendo en este caso. Estoy configurando el marco de la máscara en un tamaño más pequeño que el marco de la image de modo que, por supuesto, no llena toda el área.

Sin embargo, espero que configurar el marco de la máscara para que coincida con el de imageView haría que los bordes derecho e inferior de la máscara que puedo ver en la última captura de pantalla se alinean con los bordes derecho e inferior de imageView . Si imageView el marco, los límites y la imageView las máscaras, son exactamente lo que espero: el marco y los límites coinciden con la imageView la imageView y el contentsRect la imageView es (0.0, 0.0, 1.0, 1.0) . CALayer que un CALayer mostrará una parte de su contenido en base a la ContentRect, de modo que a less que el rectángulo sea menor a 1.0×1.0, debería mostrarse toda la image del contenido. ¿Derecha? ¿Pero por qué no es eso lo que estoy viendo?

Descargo tu proyecto de demostración y reescribo algunos códigos como este:

override func viewDidLoad () {super.viewDidLoad ()

 let mask = CALayer() let maskImage = UIImage(named: "chatGif")! print("image size is \(maskImage.size)") mask.contents = maskImage.CGImage mask.frame = CGRect(origin: CGPointZero, size: maskImage.size) imageView.layer.mask = mask imageView.layer.masksToBounds = true 

}

El tamaño de la image de tu máscara es (39.5, 32.5). Parece algo mal con tu chatGif.png

la instantánea introduzca la descripción de la imagen aquí

De acuerdo, finalmente me di count de lo que está sucediendo. Agregué las mismas instrucciones de printing de debugging al proyecto de ejemplo que hice que había colocado en mi proyecto real y descubrí que el marco de la image de vista en el momento en que estaba configurando la máscara era mucho mayor que lo esperaba y no su tamaño de visualización final . Eso tiene sentido porque en el proyecto de ejemplo estaba configurando la máscara en viewDidLoad , antes de que se hubiera presentado cualquier subvención.

No me di count de que este era el caso al imprimir valores en mi proyecto real porque mi UIImageView está en un UITableViewCell , por lo que su tamaño no inicializado era el mismo que el tamaño del marcador de position en el guión gráfico, que no era mucho más grande que El tamaño final, por lo que no fue tan obviamente demasiado grande.

Ahora si solo pudiera recuperar las últimas 4 horas de mi vida.

EDITAR: Para aclarar, el código inicial funciona bien si se ejecuta después de que la vista de image tiene su tamaño de layout final establecido. Por lo tanto, debe configurar la máscara en viewDidLayoutSubviews , o si se trata de una tabla / celda de colección, puede verificar si el tamaño del marco ha cambiado en layoutSubviews.