PhotosPicker를 사용하면 앨범으로부터 원하는 미디어를 불러오는데 사용될 수 있습니다

 

에러 발생

PhotosPicker를 통해서 이미지를 불러와 화면에 띄우는 작업을 하던 도중 사진이 자동으로 회전되어 출력되는 것을 확인할 수 있었습니다.

 

사진 처리 코드

불러온 사진은 다음과 같이 처리됩니다.

struct PhotosSavingView: View {
    
    @State private var selectedImage: Image?
    var selectedImageData: PhotosPickerItem
    
    var body: some View {
        VStack {
            selectedImage?
                .resizable()
                .scaledToFit()
                .padding()
        }
        .onAppear {
            selectedImageData.loadTransferable(type: Image.self, completionHandler: { result in
                DispatchQueue.main.async {
                    guard selectedImageData == self.selectedImageData else { return }
                    switch result {
                    case .success(let image?):
                        selectedImage = image
                    case .success(nil): break
                    case .failure(let failure):
                        print(failure.localizedDescription)
                        return
                    }
                }
            })
        }
    }
}

 

해결 방법

방법은 loadTransferable 메서드를 통해서 PhotosPickerItem를 직접 Image로 변환하였지만 Image 대신 Data로 변환하여 사용하면 문제가 해결됩니다.

struct PhotosSavingView: View {
    
    @State private var selectedImageData: Data?
    var selectedImageItem: PhotosPickerItem
    
    var body: some View {
        VStack {
            if let data = selectedImageData, let uiImage = UIImage(data: data) {
                Image(uiImage: uiImage)
                    .resizable()
                    .scaledToFit()
                    .padding()
            }
        }
        .onAppear {
            selectedImageItem.loadTransferable(type: Data.self, completionHandler: { result in
                DispatchQueue.main.async {
                    guard selectedImageItem == self.selectedImageItem else { return }
                    switch result {
                    case .success(let image?):
                        selectedImageData = image
                    case .success(nil): break
                    case .failure(let failure):
                        print(failure.localizedDescription)
                        return
                    }
                }
            })
        }
    }
}

 

해결 후 결과

 

 

 

ytw_developer