web-dev-qa-db-ja.com

Swiftカメラロールから画像とビデオをフェッチ

カメラロールアセットの取得に「PHAsset」を使用しています。私は使っている

PHAsset.fetchAssetsWithMediaType(.Image, options: options)

すべてのギャラリー画像を取得します。しかし、すべての画像とビデオを同時にフェッチして、コレクションビュー(Instagramのカメラビューなど)に表示したいと思います。

どうすればいいのか教えてもらえますか?

9
Rupshikha

実際の解決策(Swift4およびおそらくSwift 3):viewDidLoadで、またはケースに適した場所で、checkAuthorizationForPhotoLibraryAndGet()を呼び出します。

    private func getPhotosAndVideos(){

        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate",ascending: false)]
        fetchOptions.predicate = NSPredicate(format: "mediaType = %d || mediaType = %d", PHAssetMediaType.image.rawValue, PHAssetMediaType.video.rawValue)
        let imagesAndVideos = PHAsset.fetchAssets(with: fetchOptions)
        print(imagesAndVideos.count)
    }

    private func checkAuthorizationForPhotoLibraryAndGet(){
        let status = PHPhotoLibrary.authorizationStatus()

        if (status == PHAuthorizationStatus.authorized) {
            // Access has been granted.
            getPhotosAndVideos()
        }else {
            PHPhotoLibrary.requestAuthorization({ (newStatus) in

                if (newStatus == PHAuthorizationStatus.authorized) {
                        self.getPhotosAndVideos()
                }else {

                }
            })
        }
    }

1)mediaType ==%dの代わりにmediaType =%dが使用されていることを確認してください

2)実際に認証があり、フォトライブラリにアクセスできることを確認してください。そうしないと、サイレントに失敗します。

10
Mehdi Abderezai

これはあなたのために働くかもしれません:

let allMedia = PHAsset.fetchAssetsWithOptions(fetchOptions)
let allPhotos = PHAsset.fetchAssetsWithMediaType(.Image, options: fetchOptions)
let allVideo = PHAsset.fetchAssetsWithMediaType(.Video, options: fetchOptions)
print("Found \(allMedia.count) media")
print("Found \(allPhotos.count) images")
print("Found \(allVideo.count) videos")

メディアタイプは次のように定義されます。

public enum PHAssetMediaType : Int {

    case Unknown
    case Image
    case Video
    case Audio
}

OptionSetTypeではないため、ビットフィールドのように使用してPHAsset.fetchAssetsWithMediaTypeに組み合わせることができませんが、PHAsset.fetchAssetsWithOptionsは機能する可能性があります。結果セットからオーディオタイプを除外する準備をしてください。

4
David S.

NSPredicateを自由に使用できました。

let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", 
                                                 ascending: false)]
fetchOptions.predicate = NSPredicate(format: "mediaType == %d || mediaType == %d", 
                                     PHAssetMediaType.image.rawValue,
                                     PHAssetMediaType.video.rawValue)
fetchOptions.fetchLimit = 100

let imagesAndVideos = PHAsset.fetchAssets(with: fetchOptions)
4
Dima