Xcode 9 asset catalogue Preserves Vector Data 不起作用?

Xcode 9 asset catalog Preserves Vector Data not working?

我认为 Xcode 9 资产目录中的新保留矢量数据复选标记最终会让我们调整矢量 PDF 图像的大小,但显然不是。这是我在预览中两次缩放后看到的测试图像:

放大后效果很好,很清晰,很明显这是一张矢量图。但这是我的应用程序中两个图像视图的样子:

那么我的矢量数据在哪里?这个非常需要的功能仍然在行动中缺失吗?它仍然只适用于自动生成的 2x 和 3x 图像吗?如果是这样,“保留矢量数据”复选框给我们带来了什么我们还没有的东西?

它有效,但前提是您自己执行调整大小:

这是用代码实现的,像这样:

    let im = UIImage(named:"Image")!
    let r = UIGraphicsImageRenderer(size:self.iv2.bounds.size)
    let im2 = r.image {
        _ in
        im.draw(in: self.iv2.bounds)
    }
    self.iv2.image = im2
    self.iv2.contentMode = .center

因此 UIImageView 将在缩放时进行栅格化(例如,对于 Aspect Fit),但在代码中绘制将保留矢量数据。

编辑 Xcode 9 beta 5 中的新功能,现在可以按预期工作了!在此屏幕截图中,第二个图像视图仅进行缩放以填充,仅此而已。我们大幅调整尺寸!

EDIT 在使用 Xcode 11 的过程中,我终于找到了一个始终有效的公式。这意味着在启动时,无需额外代码,在图像视图或其他地方,基于矢量的图像在任何尺寸下都显得清晰。

在资产目录中,您必须将比例弹出菜单设置为独立比例并将基于矢量的图像放入 1x 槽中。选中保留矢量数据。完成。

编辑: 在 Xcode 9 GM (9A235)

中仍然存在相同的错误行为

截至今天(Xcode 9 beta 6 9M214v),如果 UIImageView 至少有 3 个与间距相关的约束,图像将只能正确呈现(不模糊)。

例如。左侧间距、右侧间距、顶部间距以及定义 UIImageView 高度的另一个约束。

另请注意,完全禁用自动布局将使所有 UIImageView 呈现不正确。

我为这个错误填写了 rdar://34306192 (http://www.openradar.me/radar?id=4968083747766272)。

就我而言 (Xcode 9.4.1),在 Interface Builder 中创建了 imageView - 我注意到当我最初到达屏幕时,图像模糊。如果我随后更改设备方向,图像就会变得清晰。我尝试在 viewDidLoad() 中手动调用不同的方法,这是我目前发现的:

这有效:

let image = imageView.image
imageView.image = nil
imageView.image = image

None 个有效:

imageView.layoutSubviews()
imageView.layoutMarginsDidChange()
imageView.setNeedsLayout()
imageView.setNeedsDisplay()
imageView.reloadInputViews()
imageView.updateConstraints()
imageView.contentMode = .center ; imageView.contentMode = .scaleToFill

如果你经常调用它,你当然应该扩展或subclass UIImageView,例如

class UIImageViewWithPreserveVectorDataFix: UIImageView {
    override func awakeFromNib() {
        super.awakeFromNib()
        let image = self.image
        self.image = nil
        self.image = image
    }
}

(然后当然在 Interface Builder 中将 UIImageViewWithPreserveVectorDataFix 设置为 class)

我在使用新 Preserves Vector Data 时多次遇到同样的问题。

非常简单的解决方案,效果很好对我来说

  1. 从不 在 Interface Builder 中设置 UIImageView image 属性,将其留空。
  2. 以编程方式设置 image 值。

希望对您有所帮助。