2015-02-06 12 views
10

Per alcuni video, requestImageForAsset viene completato con un UIImage che è nullo. Per altri video funziona bene e non ho ancora capito perché.PHImageManager.requestImageForAsset restituisce nil quando si crea una miniatura per il video

func createThumbnailForVideo(video: PHAsset) -> Future<NSURL> { 
    let promise = Promise<NSURL>() 
    let options = PHImageRequestOptions() 
    options.synchronous = true 

    imageManager.requestImageForAsset(video, targetSize: CGSizeMake(640, 640), contentMode: .AspectFill, options: options) { (image:UIImage!, info) -> Void in 

     if image == nil { 
      println("Error: Couldn't create thumbnail for video") 
      promise.error(MyErrors.videoThumb()) 
     } else { 
      if let thumbURL = self.savePhotoAsTemporaryFile(image) { 
       promise.success(thumbURL) 
      } else { 
       promise.error(MyErrors.videoThumb()) 
      } 
     } 
    } 

    return promise.future 
} 

ho anche tornare informazioni per la richiesta, ma non so come interpretare le informazioni:

[PHImageResultIsDegradedKey: 0, PHImageResultWantedImageFormatKey: 4037, PHImageResultIsPlaceholderKey: 0, PHImageResultIsInCloudKey: 0, PHImageResultDeliveredImageFormatKey: 9999] 
+0

Sembra un bug, soprattutto se è specifico per alcuni video e non per altri. [L'hai segnalato] (http://bugreport.apple.com)? – rickster

+0

Non ho segnalato come non ero sicuro che fosse un bug. Credo di poterlo fare, ma l'ultimo che ho segnalato era di nuovo in ottobre e non ho più avuto notizie. Rispondono alle segnalazioni di bug? –

risposta

31

ho avuto lo stesso problema di oggi. Per me ho dovuto aggiungere l'opzione per scaricare l'immagine, se necessario. Penso che il gestore delle immagini avesse una versione in miniatura, ma dato che non mi era stato permesso di recuperare l'immagine dalla rete, sarebbe tornata nulla alla seconda chiamata. Quindi, per risolvere questo problema ho creato un oggetto PHImageRequestOptions() come questo:

var options = PHImageRequestOptions() 
options.networkAccessAllowed = true 

quindi inviare questo come un parametro con la vostra richiesta:

PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: PHImageContentMode.AspectFill, options: options) { (image, info) -> Void in 
    if (image != nil) { 
     cell.imageView.image = image 
    } 
} 

Una volta ho fatto questa immagine il secondo callback non era pari a zero. Penso che sia comunque una buona idea evitare di avere un'immagine nulla in modo da non azzerare l'immagine della vista dell'immagine. Non penso che tu possa presumere che l'immagine sarà sempre lì. Spero che questo ti aiuti!

EDIT: Giusto per chiarire. Nel mio caso per ogni richiesta, la chiusura sarebbe stata chiamata due volte. La prima volta che l'immagine non era nulla e la seconda volta era. Penso che questo sia dovuto al fatto che era disponibile una versione di dimensioni ridotte, ma la dimensione completa non lo era. Aveva bisogno di accesso alla rete per recuperare l'immagine a dimensione intera.

+0

networkAccessAllowed = true, non ha aiutato nel mio caso. –

+4

I documenti dicono che il valore predefinito di '' 'networkAccessAllowed'' è SÌ, tuttavia le intestazioni e il comportamento osservato indicano che l'impostazione predefinita è in effetti NO. – jamone

+0

ha funzionato per me. Grazie. – jonas

0

Ho finalmente trovato il problema. Il contentMode era .AspectFill ma dovrebbe essere .AspectFit. Credo che potrei farlo funzionare modificando PHImageRequestOptionsDeliveryMode e PHImageRequestOptionsResizeMode se leggo i commenti. Tuttavia. AspectFit era quello che stavo cercando.

enum PHImageContentMode : Int { 

// Fit the asked size by maintaining the aspect ratio, the delivered image may not necessarily be the asked targetSize (see PHImageRequestOptionsDeliveryMode and PHImageRequestOptionsResizeMode) 
case AspectFit 
// Fill the asked size, some portion of the content may be clipped, the delivered image may not necessarily be the asked targetSize (see PHImageRequestOptionsDeliveryMode && PHImageRequestOptionsResizeMode) 
case AspectFill 

}

-2

ho avuto problema simile, ma era per non foto video. Mi ero perso per specificare il tipo di supporto.

self.assetsFetchResults = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 

Sopra la linea risolto il problema per me.

Problemi correlati