应用缩放后消除质量损失

Remove quality losing, after scale applied

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

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

    image?.draw(in: rect)

    /*some code here*/
}

此视图在某些时候正在双向缩放。放大后,显示的图像失去了质量。说,如果我创建大小为 20*20 的 MyView,缩放后边界 属性 保持不变,但我试图显示的转换图像质量低,因为我试图用相同的 20x20 大小绘制它.有没有办法分别为我的视图缩放绘制图像?

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

对于您的具体问题,您的 contentMode 几乎可以肯定是 scaleToFill(这是默认值)。最简单的解决方案是将其更改为 redraw 以在边界更改时强制完全重绘。这效率不高,但可能可以解决您的问题(通常没问题)。使其既高质量 高效有点复杂,并且通常需要大量特殊知识来了解您的应用程序的行为方式。对于简单的情况,UIImageView 为您所做的就是让这种高质量和高效。

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