如何防止剪辑UIImageView掩码

时间:2016-06-30 00:01:42

标签: 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.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,它们正是我所期望的:框架和边界与imageView匹配,contentsRect(0.0, 0.0, 1.0, 1.0)。据我所知,CALayer将根据contentsRect显示其内容的一部分,因此除非该rect小于1.0x1.0,否则应显示整个内容图像。对?但为什么那不是我所看到的?

2 个答案:

答案 0 :(得分:0)

我下载了你的演示项目并重写了一些这样的代码:

  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

}

maskImage的图像大小为(39.5,32.5)。你的chatGif.png

看起来有问题

快照 enter image description here

答案 1 :(得分:0)

好的,我终于想出了发生了什么。我将相同的调试打印语句添加到我制作的示例项目中,并将其放入实际项目中,并发现我设置掩码时imageView的帧比我预期的要大得多,而不是它的最终显示尺寸。这是有道理的,因为在示例项目中,我在viewDidLoad中设置了掩码,然后才布置任何子视图。

我在实际项目中打印出值时没有意识到这是因为UIImageView位于UITableViewCell,因此未初始化的大小与占位符大小相同故事板,它没有比最终尺寸大得多,所以它看起来并不显得太大了。

现在,如果我能回到生命的最后4个小时。

编辑:为了澄清,如果在图像视图设置了最终布局大小之后运行,则初始代码可以正常工作。因此,您应该在viewDidLayoutSubviews中设置掩码,或者如果它是表/集合单元格,您可以检查layoutSubviews中的帧大小是否已更改。