2016-07-06 7 views
5

Ich verwende "PHAsset" zum Abrufen von Kamera-Roll-Assets. Ich verwendeSchnelle Bilder und Videos von der Kamerarolle holen

PHAsset.fetchAssetsWithMediaType(.Image, options: options) 

zum Abrufen aller Galeriebilder. Aber ich möchte alle Bilder und Videos gleichzeitig abrufen und in einer Sammlungsansicht anzeigen (wie Instagram-Kameraansicht).

Kann mir bitte jemand sagen, wie kann ich es tun?

+0

verbesserte Formatierung – Kld

Antwort

3

Dies könnte für Sie arbeiten:

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") 

die Medientypen sind definiert als:

public enum PHAssetMediaType : Int { 

    case Unknown 
    case Image 
    case Video 
    case Audio 
} 

Weil es kein OptionSetType ist kann man es nicht wie ein Bitfeld benutzen und kombinieren sie für PHAsset.fetchAssetsWithMediaType , aber die PHAsset.fetchAssetsWithOptions könnte für Sie arbeiten. Sei nur darauf vorbereitet, Audio-Typen aus der Ergebnismenge herauszufiltern.

3

Fiel frei zu verwenden 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) 
1

tatsächliche Lösung (swift 4 und wahrscheinlich swift 3): In Ihrem viewDidLoad oder wo auch immer das Richtige für Ihren Fall Anruf 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) Stellen Sie sicher, media =% d verwendet anstelle von mediaType ==% d

2) Stellen Sie sicher, dass Sie tatsächlich eine Autorisierung haben und auf die Fotobibliothek zugreifen können, andernfalls würde sie im Hintergrund fehlschlagen.

Verwandte Themen