使用PDF矢量图像作为内容时的模糊CALayer

时间:2019-02-27 15:25:27

标签: ios swift uikit core-graphics core-animation

我正在尝试使用PDF矢量图像作为CALayer的内容,但是当将其缩放到其初始大小15x13以上时,它看起来非常模糊。我在资产目录中为有问题的图像打开了“保留矢量数据”。这是我的视图的代码,如果isComplete属性设置为{{1},则该代码在一层上绘制一个外圆,并使用第二层在视图的中心显示一个选中标记的图像。 }。

true

如果我将视图的大小设置为240x240,则此代码将导致以下显示:

enter image description here

1 个答案:

答案 0 :(得分:0)

我能够为此创建解决方法。我可以在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