Blurry CALayer при использовании векторного изображения PDF в качестве содержимого

Ну, вопрос был сделан несколько лет назад, но есть еще один способ объяснить, что здесь происходит.

Попробуйте следующую команду:

console.log("Hello World") || "Bye World";

Как упоминалось выше console.log() обычно возвращает undefined, и вы можете выбрать лучшее возвращаемое значение. Поскольку нестрогое (абстрактное) сравнение считает undefined равным false, оператор || разрешает вам этот выбор.

Учитывая, что это всего лишь инструмент отладки, в этом нет необходимости, но помогает понять, что консоль отображает текст, отправленный в stdout, а также вычисляет команду и отображает возвращаемое значение, или undefined, если значение не было получено.

0
задан Charles 27 February 2019 в 15:46
поделиться

1 ответ

Мне удалось создать обходной путь для этого. Я могу проверить ожидаемый размер моего изображения в layoutSubviews, и если он не соответствует размеру UIImage, я могу использовать UIGraphicsImageRenderer, чтобы создать новое изображение, масштабированное до правильного размера. Я создал расширение UIImage для облегчения этого:

extension UIImage {

    internal func imageScaled(toSize scaledSize: CGSize) -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: scaledSize)
        let newImage = renderer.image { [unowned self] _ in
            self.draw(in: CGRect(origin: .zero, size: scaledSize))
        }
        return newImage
    }
}

Теперь мой обновленный метод layoutSubviews выглядит следующим образом:

public override func layoutSubviews() {
    super.layoutSubviews()

    // Layout circle
    let path = UIBezierPath(ovalIn: bounds.insetBy(dx: lineWidth.mid, dy: lineWidth.mid))
    circleLayer.path = path.cgPath

    // Layout check
    if let checkImage = checkImage, checkImage.size != checkImageSize {
        checkLayer.contents = checkImage.imageScaled(toSize: checkImageSize).cgImage
    }
    let checkOrigin  = CGPoint(x: bounds.midX - checkImageSize.midW, y: bounds.midY - checkImageSize.midH)
    checkLayer.frame = CGRect(origin: checkOrigin, size: checkImageSize)
}

Это приводит к хорошему четкому изображению:

scaled image

0
ответ дан Charles 27 February 2019 в 15:46
поделиться