2015-02-06 11 views
10

W przypadku niektórych filmów requestImageForAsset kończy się z UIImage, która jest zerowa. W przypadku innych filmów działa dobrze i nie mam pojęcia, dlaczego jeszcze.PHImageManager.requestImageForAsset zwraca zero podczas tworzenia miniatur dla wideo

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 
} 

ja też odzyskać informacje na żądanie, ale nie wiem jak interpretować informacje:

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

Brzmi jak błąd, zwłaszcza jeśli dotyczy tylko niektórych filmów, a nie innych. [Czy zgłosiłeś to] (http://bugreport.apple.com)? – rickster

+0

Nie zgłosiłem tego, ponieważ nie byłem pewien, czy to błąd. Sądzę, że mogę to zrobić, ale ostatni, który zgłosiłem, był z powrotem w październiku i nic nie słyszałem. Czy odpowiadają na zgłoszenia błędów? –

Odpowiedz

31

miałem ten sam problem dzisiaj. Dla mnie musiałem dodać opcję, aby pobrać obraz, jeśli to konieczne. Wydaje mi się, że menedżer zdjęć dysponował wersją rozmiaru miniatur, ale ponieważ nie pozwoliłem mu pobrać rzeczywistego obrazu z sieci, powróciłby on do zera przy drugim wywołaniu. Tak aby to naprawić ja stworzył PHImageRequestOptions() obiektu takiego:

var options = PHImageRequestOptions() 
options.networkAccessAllowed = true 

następnie wysłać to jako param ze swoim wniosku:

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

Kiedyś zrobiłam tego zwrotna drugi obraz nie była zerowa. Myślę, że dobrym pomysłem jest ochrona przed zerowym obrazem, więc nie ustawisz obrazu do zera. Nie sądzę, że można założyć, że obraz zawsze tam będzie. Mam nadzieję że to pomoże!

EDYCJA: Tylko wyjaśnić. W moim przypadku dla każdego wniosku zamknięcie byłoby wywoływane dwukrotnie. Za pierwszym razem obraz nie był zerowy i po raz drugi był. Myślę, że to dlatego, że dostępna była wersja miniaturowa, ale pełny rozmiar nie był. Potrzebował dostępu do sieci, aby pobrać obraz w pełnym rozmiarze.

+0

networkAccessAllowed = true, nie pomogło w moim przypadku. –

+4

Dokumenty mówią, że domyślną wartością '' 'networkAccessAllowed''' jest TAK, jednak nagłówki i zaobserwowane zachowanie wskazują, że domyślnie jest to NIE. – jamone

+0

Pracowałem dla mnie. Dzięki. – jonas

0

W końcu znalazłem problem. Obiekt contentMode miał wartość .AspectFill, ale powinna być .AspectFit. Wydaje mi się, że mogę go uruchomić, modyfikując PHImageRequestOptionsDeliveryMode i PHImageRequestOptionsResizeMode, jeśli przeczytam komentarze. Jednak .SpectFit było tym, czego szukałem.

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

miałem podobny problem, ale nie było to dla zdjęć wideo. Brakowało mi określenia rodzaju mediów.

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

Powyżej linii rozwiązano problem dla mnie.

Powiązane problemy