【问题标题】:Xcode 9 asset catalog Preserves Vector Data not working?Xcode 9 资产目录保留矢量数据不起作用?
【发布时间】:2018-01-19 05:52:47
【问题描述】:

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

很好很清晰,有很多缩放,所以很明显这是一张矢量图像。但这是我的应用中两个图像视图的样子:

那么我的矢量数据呢?这个非常需要的功能仍然在起作用吗?它仍然只适用于自动生成的 2x 和 3x 图像吗?如果是这样,Preserve Vector Data 复选框为我们提供了我们尚未拥有的什么?

【问题讨论】:

    标签: asset-catalog xcode9


    【解决方案1】:

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

    从今天开始(Xcode 9 beta 6 9M214v),只有在 UIImageView 至少有 3 个与间距相关的约束时,图像才能正确渲染(不模糊)。

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

    还要注意,完全禁用自动布局会导致所有 UIImageView 渲染不正确。

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

    【讨论】:

    • 1 年后,iOS 12 和 Xcode 10 GM 仍然相同。现在已经浪费了几个小时来寻找这个问题。当然,Apple 是一家小型车库公司,没有资源来修复错误(或至少记录错误)。
    • @ernesto 请考虑欺骗我的雷达,谢谢!
    • 有没有一种快速的方法来欺骗它而不用我自己的话描述错误并提供测试用例?
    • @ernesto 当然,您可以下载Brisk,并使用 Cmd+Shift+N 提供我的雷达 ID 来归档副本:34279759
    • 这方面有什么更新吗?如果没有提到的变通方法,仍然没有解决方案让它工作?
    【解决方案2】:

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

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

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

    希望对你有帮助。

    【讨论】:

    • 哇。太感谢了 。在代码中设置图片名称是解决办法
    • 不敢相信这是解决方案!谢谢!
    • 这个解决方案在 2020 年仍然有效,谢谢!
    【解决方案3】:

    在我的例子中(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 中的类)

    【讨论】:

    【解决方案4】:

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

    这是在代码中实现的,如下所示:

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

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

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

    【讨论】:

    • 你在使用两个没有代码的普通 UIImageView 吗?如果不使用 Xcode 9b6 进行光栅化,我似乎无法渲染这两个图像...
    • @GuillaumeAlgis 是的!这些只是两个普通的图像视图,不需要代码。你记得检查 Preserves Vector Data 吗?
    • 是的,我确实检查过了附上我的示例项目:/
    • 我的图片浏览量一般。需要我把例子发给你吗?现在将其作为错误报告提交是愚蠢的;该错误已修复。
    • 谢谢马特!似乎自动布局有一个错误,与我今天早些时候填写的那个有关:openradar.me/radar?id=5005434293321728。长话短说,如果 UIImageView 的“间距”相关约束少于 3 个,它将无法正确呈现。否则它工作正常(所以它对你有用,因为你的 UIImageView 上有一个顶部、左侧和右侧的约束)。这是我机器上的结果:imgur.com/DpLd15i。顶部图像视图有 2 个约束,底部一个 3 + 高度。如果您也可以复制它,请告诉我,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2019-12-26
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多