应用比例后,移除质量损失

时间:2016-08-29 13:16:01

标签: ios uikit core-graphics cgaffinetransform

我有UIView祖先 - 让我们说MyView,它会覆盖方法-drawInRect来显示图像

override func draw(_ rect: CGRect) {
    super.draw(rect)

    image?.draw(in: rect)

    /*some code here*/
}

此视图在某个时刻会向两个方向缩放。放大后,显示的图像会失去它的质量。说,如果我创建大小为20 * 20的MyView,在缩放后边界属性保持不变,但是我试图显示的转换图像质量很低,因为我试图用相同的20x20尺寸绘制它。有没有办法分别将图像绘制到我的视图缩放?

1 个答案:

答案 0 :(得分:0)

首先,强烈考虑使用UIImageView作为子视图,而不是尝试自己实现甚至适度复杂的图像绘制。 UIImageView针对您可能遇到的许多问题进行了优化。它并不完美,如果你知道自己在做什么,有时可以手工做得更好,但是它能很好地完成它。

针对您的具体问题,您的contentMode几乎肯定是scaleToFill(这是默认设置)。最简单的解决方案是将其更改为redraw以在边界更改时强制完全重绘。这不是很高效,但可能对你的问题没问题(通常很好)。使其高质量的高效更复杂,并且通常需要您的应用程序行为的许多特殊知识。对于简单的案例,UIImageView为您做的就是高质量和高效率。

如果您可以从20x20可靠地缩放到其他特定尺寸,并且您没有太多视图,另一个技巧是以您的全尺寸绘制,然后将向下缩放到20x20。如果您有很多视图并且最终图像的大小很大,但是非常效率很低,但是可以非常快速和高质量,因此至少需要考虑。我这样做是为了处理小型缩放(例如大小为110%)。但是,将缩略图变成全屏图像可能不是一个好方法。