SwiftUI로 이미지 크기를 조정하는 방법은 무엇입니까?


110

Assets.xcassets에 큰 이미지가 있습니다. SwiftUI로이 이미지의 크기를 조정하여 작게 만드는 방법은 무엇입니까?

프레임을 설정하려고했지만 작동하지 않습니다.

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

답변:


238

.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

43

이것은 어떤가요:

struct ResizedImage: View {
    var body: some View {

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

    }
}

이미지보기는 200x200이지만 이미지는 원래 종횡비를 유지합니다 (해당 프레임 내에서 크기 조정).


이 솔루션은 제 경우 원래 종횡비를 유지하지 않습니다.
pooya

@ pm89 원본 및 최종 이미지 /보기의 크기는 얼마입니까?
혼란스러운 Vorlon 19 dec

1
원래 종횡비는 3/2이고 결과는 1/1이되어 이미지가 늘어납니다. 이것은 SwiftUI 버그 인 것 같습니다. 내가 허용 대답 아래 코멘트에 마크 강에 의해 제안 된 방법을 사용하여 종료 유형입니다 때문에 유형이 어떤 크기 속성을 노출하지 않습니다. Image(uiImage: image!).resizable().aspectRatio(image!.size, contentMode: .fill)imageUIImageImage
pooya

나에게는 종횡비 유지를 포함하여 이렇게 작동합니다. 감사합니다 👍
laka

이것은 나를 위해 종횡비를 유지하지만 크기를 존중하지 않습니다. 즉, 정사각형 이미지를 얻지 못합니다.
Chris Prince

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 모니터를 사용하고 있기 때문에 흐릿한 이미지가 보일 것입니다. 나는 정규 DPI 모니터에 넣고는 선명 보인다
벤 Leggiero

2
원본 이미지의 가로 세로 비율이 1 (이미지가 정사각형)이고를 사용하고 있기 때문에 원래 가로 세로 비율이 유지됩니다 .aspectRatio(1, .... 여기에있는 다른 솔루션이 지금까지 저에게
효과적

15

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.