我认为Xcode 9资产目录中新的Preserves Vector Data复选标记最终会让我们调整矢量PDF图像的大小,但显然不是。这是我在预览中的两个缩放比例中看到的测试图像:
漂亮而锐利,有很多变焦,所以很明显这是一个矢量图像。但这是我的应用程序中两个图像视图的样子:
那么我的矢量数据在哪里?这个非常理想的功能在行动中是否仍然缺失?它是否仍然只适用于自动生成的2x和3x图像?如果是这样,Preserve Vector Data复选框为我们提供了什么,我们还没有?
编辑:在Xcode 9 GM(9A235)中仍然存在相同的错误行为
截至今天(Xcode 9 beta 6 9M214v),如果UIImageView至少有3个与间距相关的约束,图像将只能正确渲染(非模糊)。
例如。间距为左,间距为右,间距为顶部,另一个约束定义UIImageView高度。
另请注意,完全禁用自动布局会使所有UIImageView呈现错误。
我填写了rdar:// 34306192(http://www.openradar.me/radar?id=4968083747766272)这个错误。
我用新的Preserves Vector Data
多次出现同样的问题。
超级简单的解决方案对我来说非常好:
UIImageView
image
属性,只需将其留空即可。image
值。希望能帮助到你。
在我的情况下(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中的类)
它有效,但只有你自己调整大小:
这是通过代码实现的,如下所示:
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插槽中。检查保留矢量数据。完成。