275 votes

Comment redimensionner une image avec SwiftUI?

J'ai une grande image dans Assets.xcassets. Comment redimensionner cette image avec SwiftUI pour la rendre petite ?

J'ai essayé de définir le cadre mais cela ne fonctionne pas :

Image(room.thumbnailImage)
    .frame(width: 32.0, height: 32.0)

503voto

rraphael Points 1222

Vous devriez utiliser .resizable() avant d'appliquer des modifications de taille sur une Image.

Image(room.thumbnailImage)
    .resizable()
    .frame(width: 32.0, height: 32.0)

14 votes

Et comment redimensionner l'image en conservant le ratio d'aspect?

1 votes

@MarkKang Je ne l'ai pas essayé, mais il y a une méthode nommée aspectRatio(_:contentMode:)

0 votes

Cette méthode nécessite que vous spécifiez le rapport d'aspect. Je voudrais conserver le rapport d'aspect original de l'image mais le restreindre pour qu'il s'adapte au mieux à la hauteur du cadre, en centrant le contenu de l'image et en recadrant par le cadre.

118voto

Confused Vorlon Points 529

Que diriez-vous de ceci :

struct ResizedImage: View {
    var body: some View {
        Image("myImage")
            .resizable()
            .scaledToFit()
            .frame(width: 200, height: 200)
    }
}

La vue de l'image est de 200x200, mais l'image conserve le rapport hauteur/largeur original (redimensionnement dans ce cadre).

1 votes

Cette solution ne conserve pas le rapport hauteur/largeur d'origine dans mon cas.

0 votes

@pm89 quelle taille font votre image/vue originale et finale ?

1 votes

Le rapport d'aspect original est de 3/2 et le résultat devient de 1/1 ce qui étire l'image. Il semble que ce soit un bug de SwiftUI. J'ai fini par utiliser la méthode suggérée par Mark Kang dans les commentaires sous la réponse acceptée, Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill)image est de type UIImage car le type Image n'expose aucune propriété de taille.

37voto

amp.dev Points 251

En SwiftUI, utilisez la méthode .redimensionnable() pour redimensionner une image. En utilisant .aspectRatio() et en spécifiant un ContentMode, vous pouvez soit "Adapter" soit "Remplir" l'image, selon le cas.

Par exemple, voici le code qui redimensionne l'image en l'adaptant :

Image("exemple-image")
.redimensionnable()
.aspectRatio(contentMode: .fit)

0 votes

C'est la même chose que scaleToFit()

33voto

Womble Points 2299

Élargir la réponse et les commentaires de @rraphael :

À partir de Xcode 11 beta 2, vous pouvez redimensionner une image aux dimensions souhaitées tout en conservant le ratio d'aspect d'origine en enveloppant l'image dans un autre élément.

par exemple

struct FittedImage: View
{
    let nomImage: String
    let largeur: CGFloat
    let hauteur: CGFloat

    var body: some View {
        VStack {
            Image(systemName: nomImage)
                .resizable()
                .aspectRatio(1, contentMode: .fit)
        }
        .frame(width: largeur, height: hauteur)
    }
}

struct FittedImagesView: View
{
    private let _nom = "checkmark"

    var body: some View {

        VStack {

            FittedImage(nomImage: _nom, largeur: 50, hauteur: 50)
            .background(Color.yellow)

            FittedImage(nomImage: _nom, largeur: 100, hauteur: 50)
            .background(Color.yellow)

            FittedImage(nomImage: _nom, largeur: 50, hauteur: 100)
            .background(Color.yellow)

            FittedImage(nomImage: _nom, largeur: 100, hauteur: 100)
            .background(Color.yellow)

        }
    }
}

Résultats

Images redimensionnées en conservant le ratio d'aspect

(Pour une raison quelconque, l'image apparaît un peu floue. Soyez assuré que la sortie réelle est nette.)

0 votes

Vous voyez probablement une image floue sur SO parce que vous utilisez un moniteur haute résolution. Je l'ai affiché sur un moniteur à résolution normale et elle est nette.

2 votes

Cela conserve le ratio d'aspect d'origine, uniquement parce que le ratio d'aspect de l'image d'origine est de 1 (l'image est un carré) et vous utilisez .aspectRatio(1, .... Pour autant, aucune autre solution proposée ici ne semble avoir fonctionné pour moi jusqu'à présent...

12voto

Amarshan Points 111
struct AvatarImage: View {
    var body: some View {

            Image("monImage")
                .resizable()
                .scaledToFill() // <=== Sauvegarde le ratio d'aspect
                .frame(width: 60.0, height:60)
                .clipShape(Circle())

    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X