SwiftUIで画像のサイズを変更するにはどうすればよいですか?


106

Assets.xcassetsに大きな画像があります。この画像をSwiftUIでサイズ変更して小さくするにはどうすればよいですか?

フレームを設定しようとしましたが、機能しません。

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

回答:


234

.resizable()サイズ変更を適用する前に使用する必要がありますImage

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

6
また、アスペクト比を維持しながら画像のサイズをどのように変更しますか?
マークカン

1
@MarkKang試していませんが、aspectRatio(_:contentMode:)
rraphael

4
画像( "image01").resizable().aspectRatio(UIImage(命名: "image01")!サイズ、contentMode:.fit)
マーク・カン

1
それはいいね。しかし、フィット感にはバグがあると思います。hackingwithswift.com/swiftui/...
マーク・カン

18
Image("name").resizable().scaledToFit()ただし、バグはありません。したがって、画像をビューでラップし、ビューのフレームを必要なサイズに調整してから、scaledToFit()アスペクト比を維持しながら画像を可能な限り大きくすることができます。
jemmons

42

これはどう:

struct ResizedImage: View {
    var body: some View {

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

    }
}

画像ビューは200x200ですが、画像は元のアスペクト比を維持します(そのフレーム内で再スケーリング)


私の場合、このソリューションは元のアスペクト比を維持しません。
pooya

@ pm89元の最終的な画像/ビューのサイズはどれくらいですか?
混乱したVorlon19年

1
元のアスペクト比は3/2で、結果は1/1になり、画像が引き伸ばされます。これはSwiftUIのバグのようです。受け入れられた回答の下のコメントでMarkKangによって提案された方法を使用することになりました。Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill)ここimageで、typeはsizeプロパティを公開しないUIImageため、ですImage
pooya

私にとっては、アスペクト比を維持するなど、このように動作します、ありがとう👍
ラカ

これにより、アスペクト比は維持されますが、サイズは尊重されません。つまり、正方形の画像が得られません。
クリスプリンス

19

@rraphaelの回答とコメントを拡張する:

Xcode 11ベータ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)

        }
    }
}

結果

アスペクト比を維持するフィット画像

(何らかの理由で、画像が少しぼやけて表示されています。実際の出力はシャープですのでご安心ください。)


高DPIモニターを使用しているため、SOでぼやけた画像が表示されている可能性があります。これを通常のDPIモニターに配置すると、鮮明に見えます
BenLeggiero19年

2
これにより、元の画像のアスペクト比が1(画像が正方形)であり、を使用して.aspectRatio(1, ...いる場合にのみ、元のアスペクト比が維持されます。ここでは、他のソリューションは...これまでの私のために働いていることを言うことではない
pooya

14

SwiftUIで、この.resizable()メソッドを使用して画像のサイズを変更します。を使用.aspectRatio()して指定することによりContentMode、必要に応じて画像を「フィット」または「フィル」することができます。

たとえば、次のコードをフィッティングして画像のサイズを変更します。

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

3

まあ、それは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)
 }

それが役に立てば幸い。


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

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

    }
}

3

注:私の画像名はimg_Logoです。画像名を変更して画像のプロパティを定義できます。

 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
                    }

コードと一緒に簡単なテキスト、ある種の説明を書くことを強くお勧めします。ここでの行動規範を見てください:stackoverflow.com/conduct
disp_name


2

サイズ変更でアスペクト比を使用する場合は、次のコードを使用できます。

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

2

画像サイズをハードコーディング/修正するべきではないので。これは、さまざまなデバイスで画面の解像度に応じて調整する範囲を提供するためのより良い方法です。

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

デフォルトでは、画像ビューは自動的にコンテンツに合わせてサイズ変更されるため、画面を超える可能性があります。resizable()修飾子を追加すると、代わりに、使用可能なすべてのスペースを埋めるように画像のサイズが自動的に変更されます。

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

ただし、スペースを埋めるために必要な量だけすべての次元で引き伸ばされるため、画像の元のアスペクト比が歪む可能性もあります。

アスペクト比を維持したい場合は、次のように.fillまたは.fitのいずれかを使用してaspectRatioモディファイヤを追加する必要があります。

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

1

swiftUIで画像のサイズを変更する場合は、次のコードを使用してください。

import SwiftUI

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

しかし、これには問題があります。この画像をボタン内に追加すると、画像は表示されず、青色のブロックだけが表示されます。この問題を解決するには、次のようにします。

import SwiftUI

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

1

画像のプロパティは次のように定義できます。-

   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

コードの論理構造を理解することは非常に重要です。SwiftUIと同様に、画像はデフォルトではサイズ変更できません。したがって、画像のサイズを変更するには、画像ビューを宣言した直後に.resizable()修飾子を適用して画像のサイズを変更する必要があります。

Image("An Image file name")
    .resizable()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.