カメラロールアセットの取得に「PHAsset」を使用しています。私は使っている
PHAsset.fetchAssetsWithMediaType(.Image, options: options)
すべてのギャラリー画像を取得します。しかし、すべての画像とビデオを同時にフェッチして、コレクションビュー(Instagramのカメラビューなど)に表示したいと思います。
どうすればいいのか教えてもらえますか?
実際の解決策(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)実際に認証があり、フォトライブラリにアクセスできることを確認してください。そうしないと、サイレントに失敗します。
これはあなたのために働くかもしれません:
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
は機能する可能性があります。結果セットからオーディオタイプを除外する準備をしてください。
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)