[iOS/UI] PHAsset์ ๊ณ ํ์ง ์ด๋ฏธ์ง๋ก ๋ฐ๊พธ๊ธฐ(feat.deliveryMode)
์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋ ์์๋ณผ๊ฑด PHAsset์ผ๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ UIImage๋ก ๋ณํํ ๋ ๊ณ ํ์ง๋ก ๋ณํํ๋ ๋ฒ์ ๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
Storyboard
๋จผ์ ์คํ ๋ฆฌ๋ณด๋์ ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ์ ์๊ฒ ์ด๋ฏธ์ง๋ทฐ๋ฅผ ์๋์ ๊ฐ์ด ์ธํ ํฉ๋๋ค.
ViewController
์ด๋ฏธ์ง๋ทฐ๋ฅผ ๋ทฐ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐํด์ค๋๋ค.
@IBOutlet weak var photo:UIImageView!
ํฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ allPhotos๋ฅผ ๋ฐ๋ค์ด์ค๋๋ค.
var allPhotos:PHFetchResult<PHAsset>? = nil
์ ์ ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด์ ํฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ถํ์ ์์ฒญํฉ๋๋ค.
func request() {
PHPhotoLibrary.requestAuthorization { (status) in
if status == .authorized {
self.retrieveAsset()
}
}
}
์๋์ ๊ฐ์ด PHAsset์ Image๋ก ๋ฐ๊ฟ ๋ฐํํด์ค๋๋ค.
func assetToImage(asset: PHAsset) -> UIImage {
var image = UIImage()
let manager = PHImageManager.default()
manager.requestImage(for: asset, targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFill, options: nil, resultHandler: {(result, info)->Void in
image = result!
})
return image
}
๊ทธ ๋ค์ ์ ์ ์ ๋ฐ์์ Image๋ก ๋ฐ๊พผ ๋ค photo์ ์ด๋ฏธ์ง๋ฅผ ๋ณํํ ์ด๋ฏธ์ง๋ก ๋ณด์ฌ์ค๋๋ค.
func retrieveAsset() {
let fetchOptions = PHFetchOptions()
allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
let image = assetToImage(asset: (allPhotos?.object(at: 0))!)
DispatchQueue.main.async {
self.photo.image = image
}
}
์ด๋ ๊ฒ ๋ฐ์์ค๋ฉด ์์ฃผ ์ ํ์ง์ธ ์ฌ์ง์ ๋ณผ ์ ์์ต๋๋ค....
๊ณ ํ์ง๋ก ๋ฐ์์ค๊ธฐ
๋ฐ๋ก ์ ์ ์ ์ด๋ฏธ์ง๋ก ๋ฐ๊ฟ๋ ์ต์ ์ ์ฃผ๋ ๊ฒ์ธ๋ฐ์!
PHImageRequestOptions๋ฅผ ๋ง๋ค์ด์ฃผ์๊ณ ์ฌ๊ธฐ์ deliveryMode๋ฅผ ์ค์ ํด์ค๋๋ค.
deliveryMode๋ ์ด๋ฏธ์ง์ ํ๋ฆฌํฐ๋ฅผ ์ค์ ํ ์ ์๋ ๊ฒ์ ๋๋ค.
๋๋ฆฌ๋ฒ๋ฆฌ๋ชจ๋๋ 3๊ฐ์ง๊ฐ ์๋๋ฐ์.
1. fastFormat -> ๋น ๋ฅธ ๋ก๋์ ํจ๊ป ์ ํ์ง์ ์ด๋ฏธ๋ฅผ ๋ฐ์์ต๋๋ค.
func assetToImage(asset: PHAsset) -> UIImage {
var image = UIImage()
let manager = PHImageManager.default()
let options = PHImageRequestOptions()
options.deliveryMode = .opportunistic
manager.requestImage(for: asset, targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFill, options: options, resultHandler: {(result, info)->Void in
image = result!
})
return image
}
๋๋ฆฌ๋ฒ๋ฆฌ ๋ชจ๋ ์ค ๊ฐ์ฅ ์ ํ์ง๋ก ๊ฐ์ ธ์ค๋ ๋ชจ๋์์๋ ๋ถ๊ตฌํ๊ณ ์์์ ๊ทธ๋ฅ ์ด๋ฏธ์ง๋ก ๋ณํํ์๋๋ณด๋ค ํจ์ฌ ๊น๋ํ ์ฌ์ง์ ๋ณผ ์ ์์ต๋๋ค!
2.opportunistic -> ์ด๋ฏธ์ง ํ์ง์ ๊ท ํ์ ๋ง์ถ ํ์ง์ ์ ๊ณตํฉ๋๋ค.
func assetToImage(asset: PHAsset) -> UIImage {
...
options.deliveryMode = .opportunistic
...
}
ํจ์คํธํฌ๋งท๊ณผ ๋น๊ตํด๋ดค์๋ ๋น์ทํ๊ธด ํ์ง๋ง ์กฐ๊ธ ๋ ์ ๋ช ํ ๊ฐ์ด .... ์๋ ๊ฑฐ ๊ฐ์ต๋๋ค....
(์ ๋์ ๋๊ฐ์ด ๋ณด์ด๋ค์...)
3.highQualityFormat -> ๋ก๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ด๊ณ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ ์ต๊ณ ํ์ง์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
func assetToImage(asset: PHAsset) -> UIImage {
...
options.deliveryMode = .highQulityFormat
...
}
์ด๋ฆ ๊ทธ๋๋ก ํ์ดํ๋ฆฌํฐ ์ฌ์ง์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ๋ก๋ํ๋ ์๊ฐ์ด ์ฝ๊ฐ(?) ๊ฑธ๋ฆฐ ๊ฑฐ ๊ฐ์์.
๋๋ฆฌ๋ฒ๋ฆฌ ๋ชจ๋์์ 3๊ฐ์ง ๋ชจ๋๋ ๊ฐ ๊ฐ ํฐ ์ฐจ์ด๋ ์์ง ์์๋ณด์ ๋๋ค.
๋ค๋ง ์ ์ ์ ์ด๋ฏธ์ง๋ก ๋ฐ๊ฟ๋ ์๋ฌด๋ฐ ์ต์ ์ ์ฃผ์ง ์์์ ๋๋ณด๋จ ํ์ฐํ ์ฐจ์ด๋๋ ํ์ง์ ๋ณผ ์ ์์ต๋๋ค.
ํน์๋ผ๋ ๊ถ๊ธํ์ ์ ์ด ์๊ฑฐ๋ ๊ฐ์ ํ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!