2015-02-06 145 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]; 

上述问题解决了我的问题。