Post

SwiftUI에서 url 이미지 출력

SwiftUI에서 url 이미지 출력

프로젝트 도중 이미지를 서버에서 받는데 aws를 사용하고 있어서 버킷을 이용하다 보니 url된 이미지를 표시해야 했다 애플에서는 이럴 때 사용할 수 있는 AsyncImage를 제공한다

AsyncImage

사용법은 매우 간단하다

1
2
3
4
5
6
7
8
9
AsyncImage(url: URL(string: "https://example.com/icon.png")) { phase in
    if let image = phase.image {
        image // Displays the loaded image.
    } else if phase.error != nil {
        Color.red // Indicates an error.
    } else {
        Color.blue // Acts as a placeholder.
    }
}

위 코드를 보면 Url을 이용해서 함수를 실행하고 결과를 phase에 받는다

정상적으로 이미지를 받아 오면 이미지를 표시하고 에러라면 빨강 그 이외의 문제라면 파란색을 표시한다

1
2
3
4
5
6
AsyncImage(url: URL(string: "https://example.com/icon.png")) { image in
    image.resizable()
} placeholder: {
    ProgressView()
}
.frame(width: 50, height: 50)

이렇게 작성하다면 로딩중 프로그래스 뷰를 출력한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
AsyncImage(url: url) { phase in
    switch phase {
    case .empty:
        ProgressView() // 로딩 중 표시
    case .success(let image):
        image
            .resizable()
            .scaledToFill()
            .frame(width: 50, height: 50)
            .clipShape(Circle())
    case .failure:
        Image(systemName: "person.circle.fill") // 실패 시 기본 아이콘 표시
            .resizable()
            .scaledToFit()
            .frame(width: 50)
            .foregroundStyle(Color.skyBlue)
            .background(Circle().fill(Color.black))
    @unknown default:
        EmptyView()
    }
}

프로젝트에서 사용한 코드는 switch를 사용할뿐 로직은 똑같다 아직 정보를 못받았다면 프로그래스 뷰, 성공시 이미지, 실패시 시스템 이미지를 표시한다

This post is licensed under CC BY 4.0 by the author.