我想要在一个图片视图上应用聊天气泡遮罩,并且我希望遮罩图片可以自适应图片视图的尺寸。这是我用来创建和应用遮罩的代码:
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
这是我的遮罩:
但这是我得到的结果:
当我给遮罩图像添加切片时(即创建可调整大小的端部插图),我得到了这个:
我制作了一个最小化的项目来演示问题,并将其放在这里
我不理解为什么我的遮罩图像的右侧和底部会被裁剪。遮罩的框架和边界与图像视图的相匹配,而用于遮罩的图像实际上比图像视图要小,因此如果有什么问题,我希望它不要覆盖整个图像视图,而是被部分裁剪。
请问有人能解释这里发生了什么吗?我该如何防止这种行为?
编辑:我已经对此进行了更多的尝试,当我将遮罩的大小设置为与maskImage
的大小相匹配时,结果变得更加合理:
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
我得到的结果是:
或者使用遮罩资源进行切片,可以得到J.Hunter的答案中所示的图像。但这仍然不是我想要的,因为遮罩没有被拉伸以填充imageView
,周围的大部分区域被遮蔽掉了,这不应该发生,但至少我能够理解在这种情况下正在发生什么。我将遮罩的框架设置为小于imageView
的框架大小,因此它显然不能填满整个区域。
然而,我希望将遮罩的框架设置为与imageView
相匹配的尺寸,这样我在最后一个截图中可以看到的遮罩的右侧和底部边缘将与imageView
的右侧和底部边缘对齐。如果我打印出遮罩的框架、边界和contentsRect
,它们正是我期望的:框架和边界与imageView
相匹配,contentsRect
是(0.0, 0.0, 1.0, 1.0)
。我理解一个CALayer
将显示其内容的一部分,基于contentsRect
,因此除非该矩形小于1.0x1.0,否则应该显示整个内容图像,对吗?但为什么我看到的不是这样的结果呢?
CGImageCreateWithMask
方法,因为在我的实际项目中,我正在使用FLAnimatedImageView
来显示gif图像,所以遮罩必须位于UIImageView
层而不是UIImage
层。 - NewShelbyWoo