web-dev-qa-db-ja.com

Xcode 11 PDF画像アセット「ベクターデータの保持」がSwiftUIで機能しない?

Xcode 11でSwiftUIを使用して作業しているアプリで、ベクターベースのPDF「シングルスケール」を使用する画像を使用しようとしていますが、拡大縮小すると画像が常にぼやけて見えますサイズアップ。

Xcode 11のUIKitでは、これで問題はありませんでした。2つのシーンを含むダミーアプリを作成しました。どちらも同じベクター画像を表示しています。ストーリーボードの最初のシーンを作成し、HostingViewControllerを使用してSwiftUIで作成した同じシーンを埋め込みました。アプリを実行したとき、最初のシーン(UIKit)はくっきりした、ぼやけていない画像を表示しました。ただし、2番目の(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でこの問題が発生している人を探しましたが、何も見つかりませんでした。

他の誰かがこの問題を抱えていましたか、それともより良い解決策がありますか?

12
Danielle

これは私にとってはうまくいきます。最初に画像変数を宣言する必要はありません

NavigationView {
      VStack(alignment: .center, spacing: 8) {
      Spacer()
      Text("Logo vector SwiftUI")

      Image(systemName: "text.bubble") // or Image("ImageName") for local assets
          .resizable().aspectRatio(contentMode: .fit)
          .frame(width:100, height:100)


            }
            ...
        }

1
jlqe

各PDF画像アセットで「IPreserve Vector Data」を有効にしてみてください(「Assets.xcassets」フォルダーで画像を選択し、次に「属性インスペクター>画像セット>サイズ変更」で)

0
user12532341