Ios 如何防止UIImageView遮罩的剪裁
我想将聊天泡泡遮罩应用于图像视图,并且我想将遮罩图像缩放以适合图像视图的框架。这是我用来创建和应用遮罩的代码:Ios 如何防止UIImageView遮罩的剪裁,ios,uiimageview,calayer,Ios,Uiimageview,Calayer,我想将聊天泡泡遮罩应用于图像视图,并且我想将遮罩图像缩放以适合图像视图的框架。这是我用来创建和应用遮罩的代码: 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.mas
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
这给了我:
或者,通过对面具资源进行切片,我可以在用户的回答中获得图像。这仍然不是我想要的,因为遮罩没有被拉伸以填充imageView
,并且侧面周围的大部分被遮罩掉了,但我至少可以理解在这种情况下发生了什么。我将遮罩的边框设置为比imageView的边框小的尺寸,因此它当然不会填充整个区域
但是,我希望将遮罩的框架设置为与
imageView
的框架匹配将使我在最后一个屏幕截图中看到的遮罩的右边缘和下边缘与imageView
的右边缘和下边缘对齐。如果我打印出掩码的帧、边界和内容反射
,它们正是我所期望的:帧和边界与图像视图
匹配,内容反射
是(0.0、0.0、1.0、1.0)
。据我所知,CALayer
将根据contentsRect
显示其部分内容,因此除非rect小于1.0x1.0,否则应显示整个内容图像。对吗?但为什么这不是我看到的 我下载了您的演示项目并重写了如下代码:
重写func viewDidLoad(){ super.viewDidLoad() } 你的面具的图像大小是(39.5,32.5)。您的chatgf.png似乎有问题 快照 好吧,我终于弄明白发生了什么事。我将相同的调试打印语句添加到我在实际项目中创建的示例项目中,并发现在设置遮罩时,
imageView
s帧比我预期的要大得多,而不是它的最终显示大小。这是有意义的,因为在示例项目中,我在布局任何子视图之前在viewDidLoad
中设置了掩码
我在实际项目中打印值时没有意识到这一点,因为我的UIImageView
位于UITableViewCell
中,所以它的未初始化大小与情节提要中的占位符大小相同,它没有比最终大小大多少,所以它的读数显然不是太大
现在我要是能找回我生命的最后4个小时就好了
编辑:为了澄清,如果在图像视图设置了最终布局大小后运行初始代码,则初始代码可以正常工作。因此,您应该在
viewdilayoutsubviews
中设置掩码,或者,如果是表格/集合单元格,您可以检查布局子视图中的帧大小是否已更改。可能会对您有所帮助。不幸的是,我不能使用CGImageCreateWithMask
方法,因为在我的实际项目中,我使用FLAnimatedImageView
来显示GIF,因此掩码需要位于UIImageView
层,不是UIImage
层,这是我在chatgf
资源上切片得到的结果,这与调用resizebleimagewithcapinsets
相同。当您这样做,然后获取maskImage的大小时,该大小是资产的最小大小。如果您查看chatGif.png文件,您可以看到它是294x174。我想要的是使遮罩边框大小与imageView边框大小相同,并将遮罩比例设置为该大小,而不是更大。我将用更多信息更新我的问题。@NewShelbyWoo它让我困惑。我用Photoshop打开chatgf.png并检查频道,一切正常。我面临同样的问题,你做了什么来修复它?我更新了我的解决方案。您只需在设置最终大小后运行初始代码。谢谢,我在uicollectionViewCell中对imageView应用掩码时遇到了相同的问题,我通过调用cell.setNeedsLayout()cell.LayoutFneeded()函数并覆盖自定义单元格中需要的LayoutFneeded()来解决这个问题
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