9

我正在通过 PHImageManager 从相机胶卷中加载图像,但返回的图像不是视网膜分辨率。我必须自己为 2x 和 3x 提供一个乘数还是我有什么问题?

这是我的代码:

class ReviewableImageView: UIImageView {

    ...unrelated code

    imageRequestOptions = PHImageRequestOptions()
    imageRequestOptions.deliveryMode = .HighQualityFormat
    imageRequestOptions.resizeMode = .Exact

    ...unrelated code

    self.contentMode = .ScaleAspectFit
    self.backgroundColor = UIColor.clearColor()
    self.userInteractionEnabled = true

    ... unrelated code

    func reloadImage(){
        let imageManager = PHCachingImageManager()//PHImageManager()

        imageManager.requestImageForAsset(self.imageAsset,
            targetSize: self.frame.size,
            contentMode: .AspectFit,
            options: imageRequestOptions,
            resultHandler: { (image: UIImage!, info: [NSObject : AnyObject]!) in
                self.image = image
        })
    }

}
4

2 回答 2

10

根据我对您的实验,PHImageManager您必须提供一个targetSize像素为单位的值。例如,假设您想要请求大小为 400x800 像素的图像。对于这种情况,您可以设置目标大小,如下所示:

 // Set target size.
 let targetSize = CGSizeMake(400, 800)

关于您的代码示例,在Apple 的文档中指出:

框架矩形的坐标始终以点为单位指定。

因此,要在这种情况下设置正确的目标大小,您可以使用类似于以下的代码:

// Get scale factor associated with the screen. 
let scale = UIScreen.mainScreen().scale

// Request the image.
imageManager.requestImageForAsset(self.imageAsset,
            targetSize: CGSizeMake(self.frame.size.width * scale, self.frame.size.height * scale),
            contentMode: .AspectFit,
            options: imageRequestOptions,
            resultHandler: { (image, info) -> Void in
                // Handle the result here...
        })
于 2016-04-06T13:56:56.970 回答
2

从您的代码中很难判断您是否意识到resultHandler将被多次调用。第一次调用时,可能会得到低分辨率的低质量图像。但最终它将使用正确缩放的图像调用。

于 2015-07-31T20:13:27.127 回答