Xcode 11 PDF 图像资源"Preserve Vector Data" SwiftUI 中不起作用?



我正在尝试在 Xcode 11 中使用 SwiftUI 的应用程序中使用"Single-Scale"使用基于矢量的 PDF 图像,但是当我放大大小时,图像总是看起来很模糊。

我在 Xcode 11 的 UIKit 中对此没有任何问题。我创建了一个包含 2 个场景的虚拟应用程序,这两个场景都显示相同的矢量图像。我在故事板中创建了第一个场景,然后使用 HostingViewController 嵌入了在 SwiftUI 中制作的相同场景。当我运行应用程序时,第一个场景(UIKit(显示了一个清晰,不模糊的图像。然而,第二个场景(SwiftUI(很模糊,尽管使用相同的源图像资产,但似乎没有使用矢量数据。

我能够通过使用矢量图像创建 UIImage 来"解决此问题",然后使用此 UIImage 扩展在 UIImage 传递到Image之前调整其大小。但是,我在resized(to:)方法中输入的大小在运行时没有区别,因此我还必须在"var body"中添加image.frame(w:,h:)以使其显示正确的大小。

let uiImage = UIImage(named: "Logo-vector")!
var image: Image {
Image(uiImage: uiImage.resized(to: CGSize(width: 500, height: 500)))
.resizable()
}
var body: some View {
NavigationView {
VStack(alignment: .center, spacing: 8) {
Spacer()
Text("Logo vector SwiftUI")
image
.frame(width: 240, height: 216)
...
}
...
}
}
}
extension UIImage {
func resized(to size: CGSize) -> UIImage {
return UIGraphicsImageRenderer(size: size).image { _ in
draw(in: CGRect(origin: .zero, size: size))
}
}
}

使用此解决方法,图像清晰且在运行时正确调整大小,但感觉有点黑客。

我在网上到处寻找不同的解决方案,或者其他任何专门使用 SwiftUI 遇到此问题的人,但根本没有找到任何东西。

有没有其他人遇到过这个问题,或者有人有更好的解决方案?

尝试在每个pdf图像资源上启用"IPreserve矢量数据" (在"Assets.xcassets"文件夹中选择图像,然后在"调整大小>>图像集的属性检查器中选择图像(

我把一个名为RessizeableVector的跨平台框架放在一起,它执行相同的调整大小方法。

extension PlatformImage {
func resized(to size: CGSize) -> PlatformImage {
return GraphicsImageRenderer(size: size).image { _ in
self.draw(in: CGRect(origin: .zero, size: size))
}
}
}

其中 PlatformImage 只是 UIImage 或NSImage 的 typealias,GraphicsImageRenderer 是 UIGraphicsImageRenderer 或 MacGraphicsImageRenderer 的类型别名。

该框架提供了一个名为 RessizeableVector 的 SwiftUI 视图来代替 Image。如果需要,它还可以遵循原始纵横比。

您可以使用 SPM 添加它 - 在 GitHub 上查看: https://github.com/Matt54/ResizableVector

最新更新