Мне удалось создать обходной путь для этого.Я могу проверить ожидаемый размер моего изображения в 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)
}
В результате получается хорошее четкое изображение: