Xcode 9资产目录保留矢量数据不起作用?

mat*_*att 18 asset-catalog xcode9

我认为Xcode 9资产目录中新的Preserves Vector Data复选标记最终会让我们调整矢量PDF图像的大小,但显然不是.这是我在预览中的两个缩放比例中看到的测试图像:

在此输入图像描述

在此输入图像描述

漂亮而锐利,有很多变焦,很明显这是一个矢量图像.但这是我的应用程序中两个图像视图的样子:

在此输入图像描述

那么我的矢量数据在哪里?这个非常理想的功能在行动中是否仍然缺失?它是否仍然只适用于自动生成的2x和3x图像?如果是这样,Preserve Vector Data复选框为我们提供了什么,我们还没有?

Gui*_*gis 14

编辑:在Xcode 9 GM(9A235)中仍然存在相同的错误行为

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

例如.间距为左,间距为右,间距为顶部,另一个约束定义UIImageView高度.

在此输入图像描述

另请注意,完全禁用自动布局会使所有UIImageView呈现错误.

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

  • 一年后使用 iOS 12 和 Xcode 10 GM,它仍然是一样的。现在已经浪费了几个小时来发现这个问题。当然,Apple 是一家小型车库公司,没有资源来修复错误(或至少记录它们)。 (2认同)
  • @ernesto 当然,你可以下载 [Brisk](https://github.com/br1sk/brisk),然后使用 Cmd+Shift+N 给我的雷达 ID 提交一份副本:34279759 (2认同)

Fme*_*ina 8

新版本我多次遇到同样的问题Preserves Vector Data

超级简单的解决方案对我来说非常有效:

  1. 永远不要UIImageView image在Interface Builder中设置该属性,只需将其留空即可。
  2. image编程方式设置该值。

希望能帮助到你。


mat*_*att 5

它有效,但是仅当您自己执行调整大小时:

在此处输入图片说明

这是通过代码实现的,如下所示:

    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
Run Code Online (Sandbox Code Playgroud)

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

编辑 Xcode 9 beta 5中的新增功能,现在可以正常使用了!在此屏幕快照中,第二个图像视图仅按比例缩放即可填充,仅此而已。我们调整大小!

在此处输入图片说明

编辑在玩Xcode 11时,我终于找到了一个始终有效的公式。这意味着在启动时,无需额外的代码,在图像视图或其他地方,基于矢量的图像无论大小都会显得清晰。

在资产目录中,必须将“比例”弹出菜单设置为“单个比例”,然后将基于矢量的图像放入1x插槽。检查保留向量数据。做完了


Nik*_*iev 5

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

这工作:

let image = imageView.image
imageView.image = nil
imageView.image = image
Run Code Online (Sandbox Code Playgroud)

这些都不起作用:

imageView.layoutSubviews()
imageView.layoutMarginsDidChange()
imageView.setNeedsLayout()
imageView.setNeedsDisplay()
imageView.reloadInputViews()
imageView.updateConstraints()
imageView.contentMode = .center ; imageView.contentMode = .scaleToFill
Run Code Online (Sandbox Code Playgroud)

UIImageView如果您经常调用它,那么您当然应该扩展或子类化,例如这样

class UIImageViewWithPreserveVectorDataFix: UIImageView {
    override func awakeFromNib() {
        super.awakeFromNib()
        let image = self.image
        self.image = nil
        self.image = image
    }
}
Run Code Online (Sandbox Code Playgroud)

(然后将其设置UIImageViewWithPreserveVectorDataFix为Interface Builder中的类)