Resim SwiftUI ile nasıl yeniden boyutlandırılır?


98

Assets.xcassets'te büyük bir resmim var. Bu resmi SwiftUI ile küçültmek için nasıl yeniden boyutlandırabilirim?

Çerçeve ayarlamaya çalıştım ama işe yaramıyor:

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

Yanıtlar:


219

.resizable()Herhangi bir boyut değişikliği uygulamadan önce kullanmalısınız Image.

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

4
Ve en boy oranını koruyarak görüntüyü nasıl yeniden boyutlandırırsınız?
Mark Kang

@MarkKang bunu deneyin vermedi, ancak adlandırılmış yöntem yokturaspectRatio(_:contentMode:)
rraphael

4
Görüntü ("image01") .resizable () .aspectRatio (UIImage (ad: "image01") !. boyut, contentMode: .fit)
Mark Kang

1
İyi olur. Ama bence uygun bir hata var. hackingwithswift.com/swiftui/…
Mark Kang

17
Image("name").resizable().scaledToFit()yine de dinleniyor değil. Böylece görüntünüzü bir görünüme sarabilir, görünümün çerçevesini ihtiyacınız olan boyuta ayarlayabilir, ardından scaledToFit()en boy oranını korurken görüntüyü olabildiğince büyük hale getirebilirsiniz.
jemmons

38

Buna ne dersin:

struct ResizedImage: View {
    var body: some View {

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

    }
}

resim görünümü 200x200'dür, ancak resim orijinal en boy oranını korur (bu çerçeve içinde yeniden ölçeklendirme)


Bu çözüm benim durumumda orijinal en boy oranını korumaz.
pm89

@ pm89 orijinal ve son görüntünüzün / görünümünüzün boyutu nedir?
Confused Vorlon

1
Orijinal en boy oranı 3/2'dir ve sonuç 1/1 olur ve görüntüyü uzatır. Bu bir SwiftUI hatası gibi görünüyor. Kabul edilen cevabın altındaki yorumlarda Mark Kang tarafından önerilen yöntemi kullandım, Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill)burada imagetür, UIImageçünkü Imagetür herhangi bir boyut özelliği göstermez.
pm89

Benim için en boy oranını korumak da dahil olmak üzere böyle çalışıyor, teşekkürler 👍
laka

Bu benim için en boy oranını koruyor, ancak boyuta saygı duymuyor - yani kare bir görüntü elde edemiyorum.
Chris Prince

18

@ Rraphael'in cevabını ve yorumlarını genişletmek:

Xcode 11 beta 2'den itibaren, görüntüyü başka bir öğeye sararak orijinal en boy oranını korurken bir görüntüyü rastgele boyutlara ölçekleyebilirsiniz.

Örneğin

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)

        }
    }
}

Sonuçlar

En boy oranını koruyan sığdırılmış görüntüler

(Bazı nedenlerden dolayı, görüntü biraz bulanık görünüyor. Gerçek çıktının keskin olduğundan emin olabilirsiniz.)


Yüksek DPI'lı bir monitör kullandığınız için muhtemelen SO'da bulanık bir görüntü görüyorsunuz. Bunu normal DPI monitöre koydum ve net görünüyor
Ben Leggiero

2
Bu, yalnızca orijinal görüntünün en boy oranı 1 (görüntü bir kare) ve siz kullandığınız için orijinal en boy oranını korur .aspectRatio(1, .... Şimdiye kadar buradaki başka bir çözümün benim için işe yaradığını
söyleyemem

10

SwiftUI'de, .resizable()bir görüntüyü yeniden boyutlandırmak için yöntemi kullanın. A kullanarak .aspectRatio()ve belirterek ContentMode, resmi uygun şekilde "Sığdır" veya "Doldur" yapabilirsiniz.

Örneğin, buraya sığdırarak resmi yeniden boyutlandıran kod:

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

Not: Resmimin adı img_Logove resim adını değiştirebilirsiniz, resim özelliklerini şu şekilde tanımlayın:

 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
                    }

Kodunuzla birlikte kısa bir metin yazmanızı şiddetle tavsiye ederim, bir çeşit açıklama. Lütfen burada davranış kurallarına bir göz atın: stackoverflow.com/conduct
disp_name

2

Yeniden boyutlandırmayla en boy oranını kullanmak istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

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

2

Görüntü boyutunu sabit kodlamamalı / düzeltmemeliyiz. Farklı cihazlarda ekranın çözünürlüğüne göre ayarlamak için aralık sağlamanın daha iyi bir yolu.

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

Diğer bir yaklaşım, değiştiriciyi kullanmaktır scaleEffect:

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

1

Görüntüyü swiftUI'de yeniden boyutlandırmak isterseniz aşağıdaki kodu kullanın:

import SwiftUI

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

Ama burada sorun var. Bu Görüntüyü bir Düğmenin içine eklerseniz, Görüntü gösterilmeyecektir, sadece bir mavi renk bloğu olacaktır. Bu sorunu çözmek için şunu yapın:

import SwiftUI

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

1

Eh, It görünüyor oldukça kolay SwiftUI onlar verilen demo ardından /: 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)
 }

Umarım yardımcı olur.


1

Görüntü Özelliklerini aşağıdaki gibi tanımlayabilirsiniz: -

   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

Kodun mantıksal yapısını anlamak çok önemlidir. SwiftUI'de olduğu gibi, bir görüntü varsayılan olarak yeniden boyutlandırılamaz. Bu nedenle, herhangi bir görüntüyü yeniden boyutlandırmak için, bir Görüntü görünümünü bildirdikten hemen sonra .resizable () değiştiricisini uygulayarak yeniden boyutlandırılabilir hale getirmeniz gerekir.

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

1

Varsayılan olarak, görüntü görünümleri içeriklerine göre kendilerini otomatik olarak boyutlandırır ve bu da ekranın ötesine geçmelerine neden olabilir. Resizable () değiştiriciyi eklerseniz, görüntü bunun yerine otomatik olarak tüm kullanılabilir alanı dolduracak şekilde boyutlandırılır:

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

Bununla birlikte, bu aynı zamanda görüntünün orijinal en boy oranının bozulmasına da neden olabilir, çünkü alanı doldurmak için gereken miktarda tüm boyutlarda gerilecektir.

En boy oranını korumak istiyorsanız, .fill veya .fit kullanarak aşağıdaki gibi bir en-boy oranı değiştiricisi eklemelisiniz:

Image("example-image")
    .resizable()
    .aspectRatio(contentMode: .fit)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.