У меня есть следующее решение, которое работает, но я не очень доволен им, так как оно кажется хакерским, поэтому, пожалуйста, кто-нибудь подскажет мне лучший способ сделать это!
То, что я делаю, - это отслеживание изменения размера изображения и установка флага с именем needsRefresh
. Во время функции draw()
представления я затем проверяю, установлен ли этот флаг, и, если это так, я создаю новый CIImage из clearColor
представления того же размера, что и отрисовываемый объект, и визуализирую его, прежде чем перейти к изображению, которое я на самом деле хочу сделать.
Это кажется действительно неэффективным, так что лучшие решения приветствуются!
Вот дополнительный код для рисования:
if needsRefresh {
let color = UIColor(mtkColor: clearColor)
let clearImage = CIImage(cgImage: UIImage.withColor(color, size: bounds.size)!.cgImage!)
ciContext.render(
clearImage,
to: targetTexture,
commandBuffer: commandBuffer,
bounds: bounds,
colorSpace: colorSpace
)
needsRefresh = false
}
Вот расширение UIColor
для преобразования ясного цвета:
extension UIColor {
convenience init(mtkColor: MTLClearColor) {
let red = CGFloat(mtkColor.red)
let green = CGFloat(mtkColor.green)
let blue = CGFloat(mtkColor.blue)
let alpha = CGFloat(mtkColor.alpha)
self.init(red: red, green: green, blue: blue, alpha: alpha)
}
}
И, наконец, небольшое расширение для создания CIImages из заданного цвета фона:
extension UIImage {
static func withColor(_ color: UIColor, size: CGSize = CGSize(width: 10, height: 10)) -> UIImage? {
UIGraphicsBeginImageContext(size)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
context.setFillColor(color.cgColor)
context.fill(CGRect(origin: .zero, size: size))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}