Возвращает ли PHImageManager изображения в пикселях или точках для экранов 2x и 3x?

Я загружаю изображения из фотопленки через 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
        })
    }

}

person eddit    schedule 31.07.2015    source источник


Ответы (2)


Согласно моим экспериментам с 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...
        })
person Stan Mots    schedule 06.04.2016
comment
Я также протестировал и обнаружил, что requestImageForAsset возвращает изображение с масштабом 1,0, поэтому вам нужно указать пиксели для targetSize. - person Joel; 11.07.2016
comment
Я бы использовал nativeScale, который вернет точное количество видимых пикселей. scale выше для некоторых моделей iPhone. Геометрия экрана - person Boris Y.; 02.06.2020

По вашему коду трудно сказать, понимаете ли вы, что resultHandler будет вызываться несколько раз. При первом вызове вы можете получить низкокачественное изображение с низким разрешением. Но в конце концов он будет вызван с правильно масштабированным изображением.

person matt    schedule 31.07.2015
comment
На самом деле, я думаю, что поскольку он использует deliveryMode = .HighQualityFormat, он получит только изображение высокого качества, а resultHandler будет срабатывать только один раз для каждого изображения. Из документа - person Individual11; 01.08.2015