2017-05-22 5 views
4

Ich bin neu in Swift. Im folgenden Code werden Fotos abgerufen und in ein Array eingefügt. Jetzt möchte ich sie in Imageviews zeigen. Wie kann ich es tun?Bilder von PHAsset in eine Bildansicht laden

Ich meine, wie, zum Beispiel, zeigen Sie ein Element des Arrays in einer Bildansicht.

var list :[PHAsset] = [] 
PHPhotoLibrary.requestAuthorization { (status) in 
    switch status 
    { 
    case .authorized: 
     print("Good to proceed") 
     let fetchOptions = PHFetchOptions() 
     let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions) 
     print(allPhotos.count) 
     allPhotos.enumerateObjects({ (object, count, stop) in 
      list.append(object) 
     }) 

     print("Found \(allPhotos.count) images") 
    case .denied, .restricted: 
     print("Not allowed") 
    case .notDetermined: 
     print("Not determined yet") 
    } 

Eine andere Frage ist: Wenn ich diese Funktion aufrufen, scheint es asynchron auszuführen. Ich meine Code Zeilen nach dem Aufruf der Funktion wird früh ausgeführt werden. Liegt das an requestAuthorization?

Antwort

1

Sie können wie folgt vorgehen: -

Erstellen Sie ein leeres Array vom Typ PHAsset: -

fileprivate var imageAssets = [PHAsset]() 

Holt alle Bilder durch Aufruf dieser Funktion: -

func fetchGallaryResources(){ 
     let status = PHPhotoLibrary.authorizationStatus() 
     if (status == .denied || status == .restricted) { 
      self.showAlert(cancelTitle: nil, buttonTitles:["OK"], title: "Oops", message:"Access to PHPhoto library is denied.") 
      return 
     }else{ 
     PHPhotoLibrary.requestAuthorization { (authStatus) in 
      if authStatus == .authorized{ 
       let imageAsset = PHAsset.fetchAssets(with: .image, options: nil) 
       for index in 0..<imageAsset.count{ 
        self.imageAssets.append((imageAsset[index])) 
       } 
     } 

    } 

Antrag auf Das Bild Wie folgt: -

let availableWidth = UIScreen.main.bounds.size.width 
let availableHeight = UIScreen.main.bounds.size.height 

Nehmen Sie das Bild von Imageassets in einer Schleife oder einzelne wie das gerade aus: -

PHImageManager.default().requestImage(for: imageAssets[0], targetSize: CGSize(width : availableWidth, height : calculatedCellWidth), contentMode: .default, options: nil, resultHandler: { (image, info) in 
     requestedImageView.image = image 

    }) 
+0

Wenn ich diese Funktion aufrufen und das Bild in der Bildansicht festlegen möchte, wird Folgendes ausgelöst: schwerwiegender Fehler: Index außerhalb des Bereichs. Es bleibt Asynchrone Ausführung. –

+0

Haben Sie ein Bild auf Ihrem Gerät? – Himanshu

+0

Ja. Ich habe es gelöst, indem ich den Code der letzten Zeile in den autorisierten Abschluss eingefügt habe und es funktioniert. Aber ich möchte es auf eine synchrone Art tun. –

4

Try this: imageView.image = convertImageFromAsset(list[0])

func convertImageFromAsset(asset: PHAsset) -> UIImage { 
    let manager = PHImageManager.default() 
    let option = PHImageRequestOptions() 
    var image = UIImage() 
    option.isSynchronous = true 
    manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in 
     image = result! 
    }) 
    return image 
} 

Hoffe, es hilft.

+0

intrigiert, warum dies wurde abgelehnt, da es der richtige Code – Spads

+1

Dank ist. Es beantwortet meine erste Frage. –

Verwandte Themen