web-dev-qa-db-ja.com

UIImagePickerControllerからPHAssetを取得する方法

PHAssetを取得しようとしていますが、PHAsset.fetchAssets(withALAssetURLs:options :)はiOS 8で非推奨になっているので、PHAssetを適切に取得するにはどうすればよいですか?

13
Peter Warbo

私は同じ問題を抱えていました、最初に権限を確認してアクセスをリクエストします:

let status = PHPhotoLibrary.authorizationStatus()

if status == .notDetermined  {
    PHPhotoLibrary.requestAuthorization({status in

    })
}

UIImagePickerControllerをトリガーするものに接続するだけです。これで、デリゲートコールは、userInfoにPHAssetを含める必要があります。

guard let asset = info[UIImagePickerControllerPHAsset] as? PHAsset
9

PHAssetは、ユーザーが承認しない限り、didFinishPickingMediaWithInfo: infoの結果に表示されません。これは、ピッカーを提示しただけでは起こりませんでした。これをコーディネーターのinit()に追加しました:

            let status = PHPhotoLibrary.authorizationStatus()

            if status == .notDetermined  {
                PHPhotoLibrary.requestAuthorization({status in

                })
            }
0
David Tristram

あなたが何を望んでいるかはわかりません。

IOS 8をターゲットにしていますか?

これは私が写真をフェッチする方法であり、iOS(8.0以降)、macOS(10.11以降)、tvOS(10.0以降)コードで機能します混乱を招く可能性がある場所にコメントされている

  1. 最初の関数は、写真を取得するオプションを設定します
  2. 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
0
Jesus Rodriguez

これが私の解決策です:

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
               }
       }
}
0
Shahul Hasan