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

问题描述 投票:13回答:4

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

enter image description here

enter image description here

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

enter image description here

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

asset-catalog xcode9
4个回答
11
投票

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

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

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

enter image description here

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

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


7
投票

我用新的Preserves Vector Data多次出现同样的问题。

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

  1. 切勿在Interface Builder中设置UIImageView image属性,只需将其留空即可。
  2. 以编程方式设置image值。

希望能帮助到你。


5
投票

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

这有效:

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

这些都不起作用:

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

你当然应该扩展或继承UIImageView,如果你经常调用它,例如这样

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

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


5
投票

它有效,但只有你自己调整大小:

enter image description here

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

    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中的新功能,现在按预期工作!在此屏幕截图中,第二个图像视图仅执行缩放,不再进行缩放。我们大幅调整!

enter image description here

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

在资产目录中,必须将“Scales”弹出菜单设置为Individual Scales,并将基于矢量的图像放入1x插槽中。检查保留矢量数据。完成。

© www.soinside.com 2019 - 2024. All rights reserved.