PHAssetを取得しようとしていますが、PHAsset.fetchAssets(withALAssetURLs:options :)はiOS 8で非推奨になっているので、PHAssetを適切に取得するにはどうすればよいですか?
私は同じ問題を抱えていました、最初に権限を確認してアクセスをリクエストします:
let status = PHPhotoLibrary.authorizationStatus()
if status == .notDetermined {
PHPhotoLibrary.requestAuthorization({status in
})
}
UIImagePickerControllerをトリガーするものに接続するだけです。これで、デリゲートコールは、userInfoにPHAssetを含める必要があります。
guard let asset = info[UIImagePickerControllerPHAsset] as? PHAsset
PHAssetは、ユーザーが承認しない限り、didFinishPickingMediaWithInfo: info
の結果に表示されません。これは、ピッカーを提示しただけでは起こりませんでした。これをコーディネーターのinit()に追加しました:
let status = PHPhotoLibrary.authorizationStatus()
if status == .notDetermined {
PHPhotoLibrary.requestAuthorization({status in
})
}
あなたが何を望んでいるかはわかりません。
IOS 8をターゲットにしていますか?
これは私が写真をフェッチする方法であり、iOS(8.0以降)、macOS(10.11以降)、tvOS(10.0以降)コードで機能します混乱を招く可能性がある場所にコメントされている
2番目の関数は実際にそれらをフェッチします
//import the Photos framework
import Photos
//in these arrays I store my images and assets
var images = [UIImage]()
var assets = [PHAsset]()
fileprivate func setPhotoOptions() -> PHFetchOptions{
let fetchOptions = PHFetchOptions()
fetchOptions.fetchLimit = 15
let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false)
fetchOptions.sortDescriptors = [sortDescriptor]
return fetchOptions
}
fileprivate func fetchPhotos() {
let allPhotos = PHAsset.fetchAssets(with: .image, options: setPhotoOptions())
DispatchQueue.global(qos: .background).async {
allPhotos.enumerateObjects({ (asset, count, stop) in
let imageManager = PHImageManager.default()
let targetSize = CGSize(width: 200, height: 200)
let options = PHImageRequestOptions()
options.isSynchronous = true
imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: options, resultHandler: { (image, info) in
if let image = image {
self.images.append(image)
self.assets.append(asset)
}
if count == allPhotos.count - 1 {
DispatchQueue.main.async {
//basically, here you can do what you want
//(after you finish retrieving your assets)
//I am reloading my collection view
self.collectionView?.reloadData()
}
}
})
})
}
}
OPの説明に基づいて編集
デリゲートを設定する必要がありますUIImagePickerControllerDelegate
次に、次の関数を実装します
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
上記のメソッド内で、次のような画像を取得します。
var image : UIImage = info[UIImagePickerControllerEditedImage] as! UIImage
これが私の解決策です:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if #available(iOS 11.0, *) {
let asset = info[UIImagePickerControllerPHAsset]
} else {
if let assetURL = info[UIImagePickerControllerReferenceURL] as? URL {
let result = PHAsset.fetchAssets(withALAssetURLs: [assetURL], options: nil)
let asset = result.firstObject
}
}
}