Как изменить размер изображения с SwiftUI?

У меня есть большое изображение в Assets.xcassets. Как изменить размер этого изображения с SwiftUI, чтобы сделать его маленьким?

Я попытался установить кадр, но он не работает:

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

Ответы

Ответ 1

Вы должны использовать .resizable() перед применением любых изменений размера Image.

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

Ответ 2

Расширяя @rraphael ответ и комментарии:

Начиная с Xcode 11 beta 2, вы можете масштабировать изображение до произвольных размеров, сохраняя при этом исходное соотношение сторон, оборачивая изображение в другой элемент.

например

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)

        }
    }
}

Результаты

Fitted images preserving aspect ratio

(По какой-то причине изображение выглядит немного размытым. Будьте уверены, что реальный результат будет резким.)

Ответ 3

Если вы хотите использовать соотношение сторон при изменении размера, вы можете использовать следующий код:

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

Ответ 4

Что ж, в SwiftUI это выглядит довольно просто/После демонстрации, которую они дали: 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)
 }

Ответ 5

Как насчет этого:

struct ResizedImage: View {
    var body: some View {

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

    }
}

размер изображения составляет 200x200, но изображение сохраняет исходное соотношение сторон (масштабирование в этом кадре)