2015-02-06 144 views
10

對於某些視頻,requestImageForAsset完成,UIImage爲零。對於其他視頻,它工作正常,我還沒有弄清楚爲什麼。當爲視頻創建縮略圖時,PHImageManager.requestImageForAsset返回nil

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 
} 

我也找回了請求的信息,但我不知道如何解釋信息:

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

聽起來像一個錯誤,特別是如果它是特定於某些視頻而不是其他人。 [你報告過](http://bugreport.apple.com)? – rickster 2015-02-06 19:26:08

+0

還沒有報告,因爲我不確定這是一個錯誤。我想我可以做到這一點,但我報告的最後一個是在十月回來,我沒有聽到任何迴應。他們是否回覆錯誤報告? – 2015-02-06 20:37:43

回答

31

我有同樣的問題今天。對我來說,我必須添加下載圖像的選項。我認爲圖像管理器有一個縮略圖大小版本可用,但由於我沒有允許它從網絡中獲取實際圖像,所以在第二次回調時將返回零。因此,要解決這個問題,我創建一個PHImageRequestOptions()對象是這樣的:

var options = PHImageRequestOptions() 
options.networkAccessAllowed = true 

然後發送此爲您的要求設置了一個param:

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

一旦我這樣做的第二個回調圖像不爲零。我認爲這是一個好主意,以防止有一個零圖像,所以你不設置圖像視圖的圖像爲零。我不認爲你可以認爲圖像將永遠在那裏。希望這可以幫助!

編輯:只是爲了澄清。在我的情況下,每個請求都會被調用兩次。第一次,圖像不是零,第二次是。我認爲這是因爲縮略圖大小的版本可用,但全尺寸沒有。它需要網絡訪問來獲取全尺寸圖像。

+0

networkAccessAllowed = true,沒有幫助我的情況。 – 2015-02-07 10:28:36

+4

文檔說'networkAccessAllowed'的默認值是YES,但是頭部和觀察到的行爲表明默認值實際上是NO。 – jamone 2015-02-12 18:14:27

+0

爲我工作。謝謝。 – jonas 2015-08-11 19:29:36

0

我終於找到了問題。 contentMode是.AspectFill,但應該是.AspectFit。我想我可以通過調整PHImageRequestOptionsDeliveryMode和PHImageRequestOptionsResizeMode來工作,如果我閱讀評論。不過.AspectFit就是我一直在尋找的東西。

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

我有類似的問題,但它是不是照片視頻。我錯過了指定媒體類型。

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

上述問題解決了我的問題。