Я нашел это чрезвычайно полезное расширение UImage, которое просто рисует цвет идеально поверх любого предоставленного изображения. Я могу прекрасно использовать его в swiftUI, но так как это не собственное расширение swiftUI, ему не хватает возможности анимировать при изменении состояния, особенно при изменении цвета.
Вот код UIKit
extension Image {
public init() { self.init("") }
static func tinted(_ named: String, with color: UIColor) -> Image {
guard let uiImage = UIImage(named: named)?.tinted(with: color)
else { fatalError("Unable to load logo image")}
return Image(uiImage: uiImage.withRenderingMode(.alwaysOriginal))
}}
extension UIImage {
public func tinted(with fillColor: UIColor) -> UIImage {
guard let img = self.cgImage else { return UIImage() }
UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.main.scale)
let context = UIGraphicsGetCurrentContext()
fillColor.setFill()
context?.translateBy(x: 0, y: self.size.height)
context?.scaleBy(x: 1.0, y: -1.0)
context?.setBlendMode(CGBlendMode.colorBurn)
let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
context?.draw(img, in: rect)
context?.setBlendMode(CGBlendMode.sourceIn)
context?.addRect(rect)
context?.drawPath(using: CGPathDrawingMode.fill)
guard let imageFromContext = UIGraphicsGetImageFromCurrentImageContext() else { return UIImage() }
let coloredImg: UIImage = imageFromContext
UIGraphicsEndImageContext()
return coloredImg
}
}
Это то, что расширение может выполнить sh:
Я пытался использовать colorMultiply и другие параметры blendMode, которые swiftUI предлагает, но ни один из них, похоже, не выполняет sh того, что делает это расширение, и я не могу воспроизвести его, хотя приведенный выше код, кажется, буквально показывает весь режим наложения, который он использует. Это основная проблема:
//This doesn't work
Image.tinted("googleLogo", with: col ? .red : .green)
.resizable().scaledToFit()
.frame(width:200, height:200)
.animation(Animation.easeInOut(duration:1))
//But this works fine with animating color change
Circle()
.fill(col ? Color.red : Color.green)
.frame(width:200)
.animation(Animation.easeInOut(duration:1))
Если кто-нибудь знает, как преобразовать указанное расширение в родной swiftUI или альтернативный способ рисования цвета solid над изображением с возможностью его анимации при изменении состояния , это очень помогло бы, так как я все еще относительно новичок в Swift.