2016-06-30 72 views
3

我想将聊天泡泡遮罩应用于图像视图,并且我希望将遮罩图像缩放以适合图像视图的框架。这是我用来创建和敷面膜代码:如何防止UIImageView遮罩的裁剪

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 

这是我的面具:

enter image description here

然而,这是我所得到的:

enter image description here

当我添加切片蒙版图像(即创建可调整大小的帽子插图)我得到这个:

enter image description here

我犯了一个很小的项目,证明这个问题,并把它here

我没有从根本上理解,为什么我的掩模图像的右边和底边越来越切出的视图。蒙版的边框和边界与图像视图相匹配,用于蒙版的图像实际上比图像视图更小,因此如果有任何内容,我希望它不会覆盖整个内容,而不是部分修剪。

有人能解释一下这里发生了什么吗?我如何防止这种行为?

编辑:我一直是这样一些玩耍,结果使一些更有意义的时候我设置了蒙版的尺寸相匹配,像这样的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 

这给了我:

enter image description here

或者在光罩资产切片,我得到了J.Hunter的答案图像。这仍然不是我想要的,因为面具没有被拉伸以填充imageView,并且围绕双方的很大一部分被掩盖掉了,这不应该是,但我至少可以理解在这种情况下发生的事情。我将面罩的框架设置为比imageView的框架更小的尺寸,因此它当然不会填满整个区域。

但是我期望设置掩码的框架与imageView匹配的框架将使掩码的右边缘和底边缘在最后一个屏幕截图中与imageView的右边缘和底边缘对齐。如果我打印出口罩的框架,边界和contentsRect,它们正是我所期望的:框架和边界匹配imageViewcontentsRect(0.0, 0.0, 1.0, 1.0)。我的理解是,CALayer将基于contentsRect显示其部分内容,因此除非该rect小于1.0x1.0,否则应显示整个内容图像。对?但为什么这不是我所看到的?

+0

也许[这个线程](http://stackoverflow.com/questions/5757386/how-to-mask-an-uiimageview)可以帮助你 –

+0

不幸的是,我不能使用'CGImageCreateWithMask'方法,因为在我的实际项目中我我正在使用'FLAnimatedImageView'来显示gif,所以掩码需要在'UIImageView'层,而不是'UIImage'层。 – NewShelbyWoo

回答

0

好吧,我终于想通发生了什么事情有些不对劲。我添加了相同的调试打印语句到我在实际项目中放入的示例项目中,并发现在设置遮罩时的框架比我预期的大得多,而不是其最终显示大小。这是有道理的,因为在示例项目中,我在viewDidLoad中设置了掩码,在任何子视图布局之前。

在我的实际项目打印出值,因为我UIImageView处于UITableViewCell时,我不知道这是事实,所以它的未初始化的大小是一样的故事板占位符的大小,这是不比最终尺寸大得多,所以它没有读得太明显。

现在,如果我只能得到我生命中最后4个小时的时间。

编辑:澄清,最初的代码工作正常,如果它在图像视图后运行它最终布局大小设置。所以你应该在viewDidLayoutSubviews中设置掩码,或者如果它是一个表/集合单元格,你可以检查layoutSubviews中的框架大小是否已经改变。

+0

我正面临同样的问题,你做了什么来解决它? –

+0

我更新了我的解决方案。您只需在设置最终大小后运行初始代码。 – NewShelbyWoo

+0

谢谢,当我在uicollectionViewCell中的imageView上应用mask时遇到了同样的问题,我设法通过在cellForItemAt函数中调用cell.setNeedsLayout() cell.layoutIfNeeded()并在我的自定义单元格中重写layoutIfNeeded –

0

我下载的演示项目和重写一些像这样的代码:

覆盖FUNC viewDidLoad中(){ 超。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 

}

您maskImage的图像尺寸为(39.5,32.5)。它看起来像你的chatGif.png

快照 enter image description here

+0

因此,这是我在“chatGif”资产上切片的结果,这与“调用'resizableImageWithCapInsets'。当你这样做,然后获取maskImage的大小时,该大小是资产的最小大小。如果您查看chatGif.png文件,您可以看到它是294x174。我想要的是使面罩框架的大小与imageView框架的大小相同,并且将面罩缩放到该大小并且不大。我会用更多信息更新我的问题。 – NewShelbyWoo

+0

@NewShelbyWoo它困惑我。我用Photoshop打开chatGif.png并查看频道,一切看起来都不错。 –