web-dev-qa-db-fra.com

Xcode 11 PDF ressources d'image "Préserver les données vectorielles" ne fonctionne pas dans SwiftUI?

J'essaie d'utiliser des images vectorielles PDF utilisant "Single-Scale" dans une application sur laquelle je travaille avec SwiftUI dans Xcode 11, mais l'image a toujours l'air floue lorsque je la redimensionne) de taille.

Je n'ai eu aucun problème avec cela dans UIKit dans Xcode 11. J'ai créé une application factice avec 2 scènes, les deux affichant la même image vectorielle. J'ai créé la première scène dans un storyboard, puis j'ai utilisé un HostingViewController pour incorporer une scène identique faite dans SwiftUI. Lorsque j'ai exécuté l'application, la première scène (UIKit) a affiché une image nette et non floue. La deuxième scène (SwiftUI) était cependant floue et ne semblait pas utiliser de données vectorielles, malgré l'utilisation de la même ressource d'image source.

J'ai pu "contourner" cela en créant un UIImage avec l'image vectorielle, puis en utilisant cette extension UIImage pour redimensionner l'UIImage avant qu'il ne soit passé dans Image. Cependant, la taille que j'entre dans la méthode resized(to:) ne fait aucune différence au moment de l'exécution, donc je dois également ajouter .frame(w:,h:) à image dans 'var body' pour le rendre montrer la bonne taille.

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))
        }
    }
}

L'image est claire et correctement redimensionnée lors de l'exécution avec cette solution de contournement, mais cela ressemble à un peu de piratage.

J'ai cherché partout en ligne une solution différente ou toute autre personne ayant ce problème spécifiquement avec SwiftUI, mais je n'ai rien trouvé du tout.

Quelqu'un d'autre a-t-il eu ce problème ou quelqu'un a-t-il une meilleure solution?

12
Danielle

Cela fonctionne pour moi. Il n'est pas nécessaire de déclarer la variable image au début

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

essayez d'activer "IPreserve Vector Data" sur chaque ressource d'image pdf (sélectionnez l'image dans le dossier "Assets.xcassets", puis dans "Inspector Attributes> Image Set> Resizing")

0
user12532341