Como redimensionar uma imagem com SwiftUI?

108

Tenho uma imagem grande em Assets.xcassets. Como redimensionar esta imagem com SwiftUI para torná-la pequena?

Tentei definir o quadro, mas não funcionou:

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

Respostas:

238

Você deve usar .resizable()antes de aplicar qualquer modificação de tamanho em um Image.

Image(room.thumbnailImage)
    .resizable()
    .frame(width: 32.0, height: 32.0)
rraphael
fonte
6
E como você redimensiona a imagem mantendo a proporção?
Mark Kang de
1
@MarkKang Eu não tentei, mas existe um método chamadoaspectRatio(_:contentMode:)
rraphael
4
Image ("image01") .resizable () .aspectRatio (UIImage (nomeado: "image01") !. size, contentMode: .fit)
Mark Kang
1
Isso seria legal. Mas acho que há um bug com ajuste. hackingwithswift.com/swiftui/…
Mark Kang
18
Image("name").resizable().scaledToFit()não está grampeado, no entanto. Assim, você pode embrulhar sua imagem em uma visualização, ajustar o quadro da visualização para qualquer tamanho que você precisar e, em seguida scaledToFit(), tornar a imagem o maior possível, mantendo a proporção de aspecto.
jemmons
42

Que tal agora:

struct ResizedImage: View {
    var body: some View {

            Image("myImage")
                .resizable()
                .scaledToFit()
                .frame(width: 200.0,height:200)

    }
}

a visualização da imagem é de 200x200, mas a imagem mantém a proporção original (redimensionando dentro desse quadro)

Vorlon confuso
fonte
Esta solução não mantém a proporção de aspecto original no meu caso.
Pooya
@ pm89 qual é o tamanho da imagem / visualização original e final?
Vorlon confuso
1
A proporção do aspecto original é 3/2 e o resultado torna-se 1/1, o que amplia a imagem. Este parece ser um bug do SwiftUI. Acabei usando o método sugerido por Mark Kang nos comentários sob a resposta aceita, Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill)onde imageé do tipo UIImageporque o Imagetipo não expõe nenhuma propriedade de tamanho.
Pooya
Para mim, funciona assim incluindo manter a relação de aspecto, graças 👍
laka
Isso mantém a proporção da imagem para mim, mas não respeita o tamanho - ou seja, eu não obtenho uma imagem quadrada.
Chris Prince
19

Expandindo a resposta e comentários de @rraphael:

A partir do Xcode 11 beta 2, você pode dimensionar uma imagem em dimensões arbitrárias, enquanto mantém a proporção original, envolvendo a imagem em outro elemento.

por exemplo

struct FittedImage: View
{
    let imageName: String
    let width: CGFloat
    let height: CGFloat

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


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

    var body: some View {

        VStack {

            FittedImage(imageName: _name, width: 50, height: 50)
            .background(Color.yellow)

            FittedImage(imageName: _name, width: 100, height: 50)
            .background(Color.yellow)

            FittedImage(imageName: _name, width: 50, height: 100)
            .background(Color.yellow)

            FittedImage(imageName: _name, width: 100, height: 100)
            .background(Color.yellow)

        }
    }
}

Resultados

Imagens ajustadas preservando proporção

(Por algum motivo, a imagem está um pouco desfocada. Tenha certeza de que a saída real é nítida.)

Womble
fonte
Você provavelmente está vendo uma imagem borrada no SO porque está usando um monitor de alto DPI. Coloquei isso em um monitor de DPI normal e parece nítido
Ben Leggiero
2
Isso mantém a proporção do aspecto original, apenas porque a proporção da imagem original é 1 (a imagem é um quadrado) e você está usando .aspectRatio(1, .... Para não dizer que qualquer outra solução aqui funcionou para mim até agora ...
pooya
14

No SwiftUI, use o .resizable()método para redimensionar uma imagem. Usando .aspectRatio()e especificando umContentMode , você pode "Ajustar" ou "Preencher" a imagem, conforme apropriado.

Por exemplo, aqui está o código que redimensiona a imagem ajustando:

Image("example-image")
.resizable()
.aspectRatio(contentMode: .fit)
amp.dev
fonte
3

Bem, parece muito fácil em SwiftUI / Seguindo a demonstração que eles deram: https://developer.apple.com/videos/play/wwdc2019/204

struct RoomDetail: View {
     let room: Room
     var body: some View {

     Image(room.imageName)
       .resizable()
       .aspectRatio(contentMode: .fit)
 }

Espero que ajude.


fonte
3
struct AvatarImage: View {
    var body: some View {

            Image("myImage")
                .resizable()
                .scaledToFill() // <=== Saves aspect ratio
                .frame(width: 60.0, height:60)
                .clipShape(Circle())

    }
}
Amarshan
fonte
3

Nota: Meu nome de imagem é img_Logoe você pode alterar o nome da imagem e definir as propriedades da imagem:

 VStack(alignment: .leading, spacing: 1) {
                        //Image Logo Start
                        Image("img_Logo")
                            .resizable()
                            .padding(.all, 10.0)
                            .frame(width: UIScreen.main.bounds.width * 0.4, height: UIScreen.main.bounds.height * 0.2)
                        //Image Logo Done
                    }
cmlcrn17
fonte
Eu recomendo fortemente que você escreva um breve texto junto com seu código, algum tipo de explicação. Por favor, dê uma olhada no código de conduta aqui: stackoverflow.com/conduct
disp_name
3

Outra abordagem é usar o scaleEffectmodificador:

Image(room.thumbnailImage)
    .resizable()
    .scaleEffect(0.5)
Luis Fer Garcia
fonte
2

Se quiser usar a proporção com redimensionamento, você pode usar o seguinte código:

Image(landmark.imageName).resizable()
                .frame(width: 56.0, height: 56.0)
                .aspectRatio(CGSize(width:50, height: 50), contentMode: .fit)
Dinesh Sharma
fonte
2

Uma vez que não devemos codificar / corrigir o tamanho da imagem. Esta é a melhor maneira de fornecer intervalo para ajustar de acordo com a resolução da tela em diferentes dispositivos.

Image("ImageName Here")
       .resizable()
       .frame(minWidth: 60.0, idealWidth: 75.0, maxWidth: 95.0, minHeight: 80.0, idealHeight: 95.0, maxHeight: 110.0, alignment: .center)
       .scaledToFit()
       .clipShape(Capsule())
       .shadow(color: Color.black.opacity(5.0), radius: 5, x: 5, y: 5)
Hanny
fonte
2

Por padrão, as visualizações de imagens se dimensionam automaticamente de acordo com seu conteúdo, o que pode fazer com que elas ultrapassem a tela. Se você adicionar o modificador resizable (), a imagem será dimensionada automaticamente para preencher todo o espaço disponível:

Image("example-image")
    .resizable()

No entanto, isso também pode fazer com que a imagem tenha sua proporção original distorcida, porque ela será esticada em todas as dimensões pelo valor necessário para fazê-la preencher o espaço.

Se quiser manter sua proporção, você deve adicionar um modificador aspectRatio usando .fill ou .fit, como este:

Image("example-image")
    .resizable()
    .aspectRatio(contentMode: .fit)
Sudão Suwal
fonte
1

Se você quiser redimensionar a imagem em swiftUI, basta usar o seguinte código:

import SwiftUI

    struct ImageViewer : View{
        var body : some View {
            Image("Ssss")
            .resizable()
            .frame(width:50,height:50)
        }
    }

Mas aqui está o problema com isso. Se você adicionar esta imagem dentro de um botão, a imagem não será mostrada, apenas um bloco de cor azul estaria lá. Para resolver esse problema, basta fazer o seguinte:

import SwiftUI

struct ImageViewer : View{
    var body : some View {
        Button(action:{}){
        Image("Ssss")
        .renderingMode(.original)
        .resizable()
        .frame(width:50,height:50)
    }
   }
}
sachin jeph
fonte
1

Você pode definir as propriedades da imagem como segue: -

   Image("\(Image Name)")
   .resizable() // Let you resize the images
   .frame(width: 20, height: 20) // define frame size as required
   .background(RoundedRectangle(cornerRadius: 12) // Set round corners
   .foregroundColor(Color("darkGreen"))      // define foreground colour 
Komal Gupta
fonte
1

É muito importante entender a estrutura lógica do código. Como no SwiftUI, uma imagem não é redimensionável por padrão. Portanto, para redimensionar qualquer imagem, você deve torná-la redimensionável aplicando o modificador .resizable () imediatamente após declarar uma visualização de imagem.

Image("An Image file name")
    .resizable()
Shawkath Srijon
fonte