Кто-нибудь знает, как преобразовать это конкретное расширение UIKit Image в SwiftUI - PullRequest
0 голосов
/ 31 марта 2020

Я нашел это чрезвычайно полезное расширение 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:

enter image description here

Я пытался использовать 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.

...