Bagaimana cara mengubah ukuran Gambar dengan SwiftUI?


98

Saya memiliki gambar besar di Assets.xcassets. Bagaimana cara mengubah ukuran gambar ini dengan SwiftUI menjadi kecil?

Saya mencoba mengatur bingkai tetapi tidak berhasil:

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

Jawaban:


219

Anda harus menggunakan .resizable()sebelum menerapkan modifikasi ukuran apa pun pada file Image.

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

4
Dan bagaimana Anda mengubah ukuran gambar dengan mempertahankan rasio aspek?
Mark Kang

@MarkKang Saya tidak mencobanya, tetapi ada metode bernamaaspectRatio(_:contentMode:)
rraphael

4
Gambar ("image01") .resizable () .aspectRatio (UIImage (bernama: "image01") !. size, contentMode: .fit)
Mark Kang

1
Itu akan menyenangkan. Tapi menurut saya ada bug yang pas. hackingwithswift.com/swiftui/…
Tandai Kang

17
Image("name").resizable().scaledToFit()tidak disadap. Jadi, Anda dapat membungkus gambar dalam tampilan, menyesuaikan bingkai tampilan dengan ukuran apa pun yang Anda butuhkan, kemudian scaledToFit()akan membuat gambar sebesar mungkin sambil mempertahankan rasio aspek.
jemmons

38

Bagaimana dengan ini:

struct ResizedImage: View {
    var body: some View {

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

    }
}

tampilan gambar adalah 200x200, tetapi gambar mempertahankan rasio aspek asli (skala ulang dalam bingkai itu)


Solusi ini tidak mempertahankan rasio aspek asli dalam kasus saya.
pm89

@ pm89 berapa ukuran gambar / tampilan asli dan akhir Anda?
Bingung Vorlon

1
Rasio aspek aslinya adalah 3/2 dan hasilnya menjadi 1/1 yang melebarkan gambar. Tampaknya ini adalah bug SwiftUI. Saya akhirnya menggunakan metode yang disarankan oleh Mark Kang di komentar di bawah jawaban yang diterima, di Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill)mana imagetipe UIImagekarena Imagetipe tidak mengekspos properti ukuran apa pun.
pm89

Bagi saya ini berfungsi seperti ini termasuk menjaga rasio aspek, terima kasih 👍
laka

Ini menjaga rasio aspek untuk saya, tetapi tidak menghargai ukurannya-- yaitu, saya tidak mendapatkan gambar persegi.
Chris Prince

18

Memperluas jawaban dan komentar @ rraphael:

Mulai Xcode 11 beta 2, Anda dapat menskalakan gambar ke dimensi arbitrer, dengan tetap mempertahankan rasio aspek asli dengan menggabungkan gambar di elemen lain.

misalnya

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)

        }
    }
}

Hasil

Gambar yang dipasang dengan mempertahankan rasio aspek

(Untuk beberapa alasan, gambar ditampilkan sebagai sedikit buram. Yakinlah bahwa hasil sebenarnya tajam.)


Anda mungkin melihat gambar buram pada SO karena Anda menggunakan monitor DPI tinggi. Saya meletakkan ini pada monitor DPI biasa dan terlihat tajam
Ben Leggiero

2
Ini mempertahankan rasio aspek asli, hanya karena rasio aspek dari gambar asli adalah 1 (gambar berbentuk persegi) dan Anda sedang menggunakan .aspectRatio(1, .... Bukan untuk mengatakan bahwa solusi lain apa pun di sini telah berhasil untuk saya sejauh ini ...
pm89

10

Di SwiftUI, gunakan .resizable()metode untuk mengubah ukuran gambar. Dengan menggunakan .aspectRatio()dan menentukan a ContentMode, Anda dapat "Pas" atau "Isi" gambar, sebagaimana mestinya.

Misalnya, berikut adalah kode yang mengubah ukuran gambar dengan menyesuaikan:

Image("example-image")
.resizable()
.aspectRatio(contentMode: .fit)

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

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

    }
}

3

Catatan: Nama gambar saya adalah img_Logodan Anda dapat mengubah nama gambar menentukan properti gambar ini:

 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
                    }

Saya sangat menyarankan Anda untuk menulis teks singkat bersama dengan kode Anda, semacam penjelasan. Silakan lihat kode etik di sini: stackoverflow.com/conduct
disp_name

2

Jika Anda ingin menggunakan aspek rasio dengan mengubah ukuran maka Anda dapat menggunakan kode berikut:

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

2

Karena kita seharusnya tidak melakukan hardcode / memperbaiki ukuran gambar. Berikut adalah cara yang lebih baik untuk memberikan jangkauan untuk menyesuaikan dengan resolusi layar pada perangkat yang berbeda.

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)

2

Pendekatan lain adalah dengan menggunakan scaleEffectpengubah:

Image(room.thumbnailImage)
    .resizable()
    .scaleEffect(0.5)

1

Jika Anda ingin mengubah ukuran gambar di swiftUI cukup gunakan kode berikut:

import SwiftUI

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

Tapi di sini ada masalah dengan ini. Jika Anda menambahkan Gambar ini di dalam Tombol, Gambar tidak akan ditampilkan, hanya blok warna biru yang akan ada di sana. Untuk mengatasi masalah ini, cukup lakukan ini:

import SwiftUI

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

1

Nah, Sepertinya cukup mudah di SwiftUI / Mengikuti demo yang mereka berikan: 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)
 }

Semoga membantu.


1

Anda dapat menentukan Properti Gambar sebagai berikut: -

   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 

1

Sangat penting untuk memahami struktur logis dari kode. Seperti di SwiftUI, gambar tidak dapat diubah ukurannya secara default. Jadi, untuk mengubah ukuran gambar apa pun Anda harus membuatnya dapat diubah ukurannya dengan menerapkan pengubah .resizable () segera setelah Anda mendeklarasikan tampilan Gambar.

Image("An Image file name")
    .resizable()

1

Secara default, tampilan gambar secara otomatis menyesuaikan ukurannya dengan kontennya, yang mungkin membuatnya melampaui layar. Jika Anda menambahkan pengubah resizable () maka gambar akan secara otomatis diubah ukurannya sehingga memenuhi semua ruang yang tersedia:

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

Namun demikian, hal itu juga dapat menyebabkan gambar memiliki rasio aspek aslinya yang terdistorsi, karena gambar akan melebar di semua dimensi dengan jumlah berapa pun yang diperlukan untuk membuatnya memenuhi ruang.

Jika Anda ingin mempertahankan rasio aspeknya, Anda harus menambahkan pengubah rasio aspek menggunakan .fill atau .fit, seperti ini:

Image("example-image")
    .resizable()
    .aspectRatio(contentMode: .fit)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.