728x90
반응형
language : swift (using storyboard)
how to get image from gallery according to ios version.
import UIKit
import Photos
import PhotosUI
ios 14부터 PHPicker 사용
ios 14 미만은 UIImagePicker 사용
ios 버전에 따라 두가지 방법을 사용.
@IBAction func touchUpAddImage(_ sender: UIButton) {
if #available(iOS 14, *) {
pickImage()
} else {
openGallery()
}
}
ios 14이상인 경우 PHPicker 사용
using PHPicker when higher than ios 14
//ios 14 이상일 때 phpicker 사용 //use phpicker when higher than ios 14
@available(iOS 14, *)
extension PreviewViewController: PHPickerViewControllerDelegate {
func pickImage(){
var configuration = PHPickerConfiguration()
// 이미지 정보를 가지고 올 필요가 있을땐 photolibarary 를 사용해준다. //use when need image file info.
// let photoLibrary = PHPhotoLibrary.shared()
// var configuration = PHPickerConfiguration(photoLibrary: photoLibrary)
configuration.selectionLimit = 1 //한번에 가지고 올 이미지 갯수 제한 //limit selectable image counts
configuration.filter = .any(of: [.images])
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
self.present(picker, animated: true, completion: nil)
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
var imgData: Data?
var img: UIImage?
var imgFile = PreviewItem()
picker.dismiss(animated: true, completion: nil)
let itemProvider = results.first?.itemProvider
if let itemProvider = itemProvider,
itemProvider.canLoadObject(ofClass: UIImage.self){
itemProvider.loadObject(ofClass: UIImage.self) {
(image, error) in
DispatchQueue.main.async {
self.preview.image = image as? UIImage
//이미지의 정보가 필요할때 사용하는 코드
// let identifiers = results.compactMap(\.assetIdentifier)
// let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: identifiers, options: nil)
// if let filename = fetchResult.firstObject?.value(forKey: "filename") as? String{
// 이미지의 이름을 가지고 옴//get image file name
// }
}
}
}
}
}
ios 14 미만인 경우 UIImagePicker 사용
using UIImagePicker when lower than ios 14
//ios 14 미만 //used when lower than ios 14
extension PreviewViewController: UIImagePickerControllerDelegate {
func openGallery(){
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .photoLibrary
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
DispatchQueue.main.async {
self.preview.image = image
}
//이미지 파일 이름 가져옴//get image file name
// var fileName: String = ""
// let imgData = image.jpegData(compressionQuality: 1.0)
// if let asset = info[UIImagePickerController.InfoKey.phAsset] as? PHAsset{
// fileName = asset.value(forKey: "filename") as? String ?? ""
}
}
self.dismiss(animated: true, completion: nil)
}
}
ios 14 이상인 경우 phpicker를 이용해 이미지를 가지고 오는 데 phpicker의 경우 photo library를 이용해 이미지 권한 확인을 하지 않는 다. 하지만 이때 PHAsset.fetchAssets를 사용해 이미지 정보를 가지고 오면 이미지를 가지고 온 후에 이미지 권한 alert창이 뒤늦게 뜨는 오류가 발생한다.
프로젝트의 Info에서 Prevent limited photos access alert를 YES로 등록하니 권한 alert가 나타나지 않으면서 이미지 정보를 가지고 올 수 있다.
728x90
반응형
'개발 > ios (swift)' 카테고리의 다른 글
scroll up textfield when keyboard show (0) | 2022.08.08 |
---|---|
UITextview Placeholder (0) | 2022.03.03 |
action when clicked button in cell of collectionView (0) | 2022.03.02 |
사파리로 링크 열기 (0) | 2022.02.18 |
댓글