k-coding

SwiftUI ) AsyncImage 본문

iOS/Swift UI

SwiftUI ) AsyncImage

chkhn_oiiu 2022. 7. 6. 01:08

SwiftUI ) AsyncImage 

 

AsyncImage는 iOS15로 업데이트되면서 생긴 기능으로

 

URLSession 인스턴스를 사용하여 할당된 URL에서 이미지를 가져오는 기능을 수행하여줍니다.

 

실제로 디바이스를 실행하고 몇 초 후 이미지가 나타나게 하는곳에 사용될 수 있습니다.

 

이번엔 이 AsyncImage를 활용하는 방법을 알아보겠습니다.

 

 

1. AsyncImage

 

struct ContentView: View {
    
    private var imageUrl : String = "https://img.freepik.com/free-vector/character-bee-set_77984-116.jpg"
    
    
    var body: some View{
        
        AsyncImage(url: URL(string: imageUrl))
        
        }
 }

 

다음과 같이 코드를 작성하면 앱 실행 후 해당 url의 이미지가 나오는것을 확인할 수 있습니다.

 

 

 

2. Scale

 

해당 이미지의 크기가 마음에 들지 않는다면 Scale을 통하여 이미지의 크기를 조정할 수 있습니다.

 

 var body: some View{
        
        AsyncImage(url: URL(string: imageUrl), scale: 3.0)
        
        }

 

scale의 값이 클 수록 이미지는 작아집니다.

 

 

3. Placeholder

 

AsyncImage는 PlaceHolder를 이용하여 특정 이미지가 먼저 화면에 나오게 한 후, AsyncImage가 나오게 합니다.

var body: some View {
       AsyncImage(url: URL(string: imageUrl)) { image in
            image
                .resizable()
                .scaledToFit()
        } placeholder: {
            Image(systemName: "photo.circle.fill")
                .resizable()
                .scaledToFit()
                .frame(maxWidth: 120)
                .foregroundColor(.purple)
                .opacity(0.5)
        }
        .padding(40)
 }

 

 

4. Extension

 

PlaceHolder처럼 2가지 이상 이미지가 존재하는 경우 이미지의 크기를 조정하기 위하여 중복된 코드가 

 

반복될 가능성이 높다. 이럴때는 Image에 Extension을 넣어 처리하는 방법이 있다.

 

extension Image {

    func imageModifier() -> some View {
        self
            .resizable()
            .scaledToFit()
    }
    
    func iconModifier() -> some View {
        self
            .resizable()
            .scaledToFit()
            .frame(maxWidth: 120)
            .foregroundColor(.purple)
            .opacity(0.5)
    }
}

 

이러한 방법을 통하여 3번의 PlaceHolder 코드를 간략화 할 수 있다.

 

var body: some View {
       AsyncImage(url: URL(string: imageUrl)) { image in
            image.imageModifier()
        } placeholder: {
            Image(systemName: "photo.circle.fill").iconModifier()
        }
        .padding(40)
 }

 

 

5. Phase

 

AsyncImage를 불러올때 URL링크를 통하여 이미지를 불러오는것이기 때문에

 

현재 이미지가 로드되는 상태에 따라서 단계별로 다른 이미지를 연출할 수 있습니다.

 

 

5 - 1  if let

      AsyncImage(url: URL(string: imageUrl)) { phase in
            if let image = phase.image {
            image
                .resizable()
                .scaledToFit()
            }else if phase.error != nil {
                Image(systemName: "ant.circle.fill").iconModifier()
            }else {
                Image(systemName: "photo.circle.fill").iconModifier()
            }
        }
        .padding(40)

 

5 - 2 Switch

     AsyncImage(url: URL(string: imageUrl) ) { phase in
            switch phase {
            case .success(let image):
                image.imageModifier()
                    .transition(.move(edge: .bottom))
            case .failure(_):
                Image(systemName: "ant.circle.cill").iconModifier()
            case .empty:
                Image(systemName: "photo.circle.fill").iconModifier()
            @unknown default:
                ProgressView()
            }
            
        }
        .padding(40)

 

실제로 위에 이미지 url을 지워서 이미지가 링크될수 없는 url이 되면 다음과 같은 화면이 나타납니다.

 

 

 

 

6. Animation

 

AsyncImage에는 Anmiation을 부여할 수 있습니다.

 

Anmation은 프리뷰에서는 확인이 안되고 시뮬레이터를 통하여 확인해야 합니다.

 

   AsyncImage(url: URL(string: imageUrl), transaction:  Transaction(animation: .spring(response: 0.5, dampingFraction: 0.6, blendDuration: 0.25))) { phase in
            switch phase {
            case .success(let image):
                image.imageModifier()
                    .transition(.move(edge: .bottom))
            case .failure(_):
                Image(systemName: "ant.circle.cill").iconModifier()
            case .empty:
                Image(systemName: "photo.circle.fill").iconModifier()
            @unknown default:
                ProgressView()
            }
            
        }
        .padding(40)

 

애니메이션의 종류는 아래와 같이 다양하게 있습니다.

 

image.imageModifier()
    .transition(.move(edge: .bottom))
    .transition(.slide)
    .transition(.scale)
    .transition(AnyTransition.scale.animation(.easeInOut))

'iOS > Swift UI' 카테고리의 다른 글

SwiftUI) ZStack / zIndex  (0) 2022.07.25
SwiftUI ) Identifiable 프로토콜  (0) 2022.07.24
SwiftUI ) 메뉴창 만들어보기  (0) 2022.07.03
SwiftUI Image로 TabView 만들어보기  (0) 2022.06.06
SwiftUI Geometry Reader  (0) 2022.05.29
Comments