티스토리 뷰
안녕하세요 :) Zedd입니다.
오늘은 UIImagePicker쓸 때, 선택된 이미지의 정보를 추출?...해내는법..?
해봅시다.
일단 보시기 전에 주의할 점이 있습니다.
iOS Deployment Target에 따라서 코드가 좀 달라지는데, 주의하시길 바랍니다.
Swift 버전은 상관없고, iOS 10~인지 11인지에 따라 달라집니다.
자신의 iOS Deployment Target이 뭔지 알아보려면,
Targets > General > Deployment info에 가셔서 Deployment Target을 보시길 바랍니다.
오늘은 10~버전이랑 11~버전 둘다 알아볼거에요. 음...왜 10버전 까지 하냐면...........그냥....아직까지 업데이트...안하신분들을 위해..
그리고 시작하기 전에, Photos를 import해주세요.
UIImagePicker로 선택된 이미지 정보 알아보기
일단 UIImagePicker사용법은 <내 사진앨범에서 사진 가져오기>에서 설명드렸으니 하지 않겠습니다.
UIImagePickerControllerDelegate에 있는
메소드 안에서 여러가지를 얻어올 수 있습니다.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
1. image
image는 <내 사진앨범에서 사진 가져오기>글에서도 가져와봤지만, 또 해봅시다.
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage{
myImageView.image = image
}
2. imageURL
<내 사진앨범에서 사진 가져오기>글에서도 말했다 시피, info는 dictionary입니다.
1번의 이미지는 UIImagePickerControllerOriginalImage라는 key에서 가져왔죠?
imageUrl은 UIImagePickerControllerReferenceURL라는 key에서 가져올 수 있습니다.
if let imageUrl = info[UIImagePickerControllerReferenceURL] as? URL{
print(imageUrl)
}
이렇게요. 그러면, assets-library://asset/asset~~~~로 시작하는 Url을 볼 수 있습니다.
하지만, iOS11에서는..
UIImagePickerControllerReferenceURL이 deprecate되었습니다....
이거때문에 진짜 너무 고생했는데요 제가 진짜...
이 UIImagePickerControllerReferenceURL로 뭘할 수 있었냐면, fetchAsset을 할 수 있었습니다.
즉, 나중에는 url로 Asset을 가져오는 건 할 수 없습니다.
진짜 왜 없앴지?...왜지..?
일단, 지금은 저 deprecate된 메소드는 쓸 수 있지만, 나중 release때는 없어질거에요!!
4번에서 설명하긴 할건데, UIImagePickerControllerReferenceURL 대신, UIImagePickerControllerPHAsset이거 쓰라잖아요?
그럼 써봅시다.
if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset {
//code
}
여기서 제가 또 부딪힌 문제.
저 asset을 프린트해보면,
이런게 담겨있습니다.
여기서 filename은 안보이지만, 이제 3번에서 할거긴 하지만, Key가 "filename"인걸 가져올 수 있습니다. 하지만....다른 key가 뭐가 있는지 애플문서를 진짜 통째로 뒤져도 안나옵니다...뭐지..
근데 제 예상은, fetchAssets(withALAssetURLs:~)도 deprecate된 마당에, key로 url이 있을 것 같지는 않습니다...
여기의 답변에 따르면, 지금까지 해결방법은 그냥..fetchAssets(withALAssetURLs:~)을 쓰는 것.
아직 Apple측에서 key를 추가하지 않은 것 같다고 해요.
3. image name
iOS 10 ) 일단 2번에서 한 imageUrl이 필요합니다.
let imageName = PHAsset.fetchAssets(withALAssetURLs: [imageUrl], options: nil).firstObject?.value(forKey: "filename")
if let imageName = imageName{
print(imageName)
}
또 다른 방법.
let assets = PHAsset.fetchAssets(withALAssetURLs: [imageUrl], options: nil)
guard let firstObject = assets.firstObject else { return }
let fileName = PHAssetResource.assetResources(for: firstObject).first?.originalFilename
print(fileName)
하지만, iOS 11에서는 이미지 이름을 가져오는 방법이 조금 다릅니다.
if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset {
if let fileName = (asset.value(forKey: "filename")) as? String {
print(fileName)
}
}
4. document directory
if let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first{
print(documentDirectory)
}
5. Photo Url
image Url과 다른거같은데..정확한 차이점을 모르겠습니다.
4번에서의 document directory가 필요합니다.
let photoURL = URL(fileURLWithPath: documentDirectory)
이렇게 UIImagePicker를 사용해서 선택한 이미지의 여러가지 정보를 알아오는 법을 알아보았는데,
그럼 이제 fetchAsset으로 딱 하나의 사진만 못가져 오는 건가 ㅠㅠㅠ firstObject로 사진 딱 하나는 가져올 수 있지만 딱 내가 원하는 사진을 가져오는 방법이
PHAsset.fetchAssets(withALAssetURLs:~)이었는데..
혹시 다른방법이 있다면, 댓글이나 PC화면 오른쪽 하단에서 볼 수 있는 메세지기능을 통해 알려주시면 정말 감사하겠습니다 ㅠㅠ 진짜로..
'iOS' 카테고리의 다른 글
iOS ) UIWebView와 WKWebView의 차이 (7) | 2017.12.09 |
---|---|
iOS ) ARKit (0) | 2017.12.04 |
iOS) 왕초보를 위한 3D touch (포스터치) - quick action (1) | 2017.12.01 |
iOS ) imageView의 content mode를 Aspect Fill로 할 시 생기는 issue (0) | 2017.11.28 |
iOS ) Delegate를 이용한 ViewController간 Data전달방법 (8) | 2017.11.27 |
- IOS
- 스위프트
- Xcode
- actor
- WWDC
- 스위프트 문법
- 제이슨 파싱
- swift tutorial
- github
- WidgetKit
- WKWebView
- swift array
- swift delegate
- fastlane
- SwiftUI
- Accessibility
- Swift
- swift sort
- swift 공부
- Combine
- 회고
- 피아노
- FLUTTER
- np-hard
- iOS delegate
- np-complete
- UIBezierPath
- swift3
- Git
- ios 13
- Total
- Today
- Yesterday