【问题标题】:Change SVG colour using SvgKit in iOS Swift在 iOS Swift 中使用 SvgKit 更改 SVG 颜色
【发布时间】:2019-12-28 08:27:04
【问题描述】:

我正在使用 SVGKit 库将 svg 渲染到图像视图中。 SVG 渲染完美,但问题是我无法填充 SVG 颜色。我在 Objective C 中发现了一些对我没有帮助的例子。这里我使用的是 Swift5。请找到随附的控制器代码。提前致谢。

代码:

let namSvgImgVar: SVGKImage = SVGKImage(named: "camera")
let namImjVar: UIImage = namSvgImgVar.uiImage
imageView.image = namImjVar

【问题讨论】:

    标签: ios swift svgkit


    【解决方案1】:

    我已经为它创建了一个扩展:

    extension SVGKImage {
    
        // MARK:- Private Method(s)
        private func fillColorForSubLayer(layer: CALayer, color: UIColor, opacity: Float) {
            if layer is CAShapeLayer {
                let shapeLayer = layer as! CAShapeLayer
                shapeLayer.fillColor = color.cgColor
                shapeLayer.opacity = opacity
            }
    
            if let sublayers = layer.sublayers {
                for subLayer in sublayers {
                    fillColorForSubLayer(layer: subLayer, color: color, opacity: opacity)
                }
            }
        }
    
        private func fillColorForOutter(layer: CALayer, color: UIColor, opacity: Float) {
            if let shapeLayer = layer.sublayers?.first as? CAShapeLayer {
                shapeLayer.fillColor = color.cgColor
                shapeLayer.opacity = opacity
            }
        }
    
        // MARK:- Public Method(s)
        func fillColor(color: UIColor, opacity: Float) {
            if let layer = caLayerTree {
                fillColorForSubLayer(layer: layer, color: color, opacity: opacity)
            }
        }
    
        func fillOutterLayerColor(color: UIColor, opacity: Float) {
            if let layer = caLayerTree {
                fillColorForOutter(layer: layer, color: color, opacity: opacity)
            }
        }
    }
    

    如果您的SVG 图像只有一层可着色,请使用fillColor,如果有多个,则使用fillOutterLayerColor,您可以根据需要对其进行修改。我就是这样使用它的:

    static func getImage(imageName: String, fontSize size: CGSize, fillColor color: UIColor?, opacity: Float = 1.0) -> UIImage? {
        let svgImage: SVGKImage = SVGKImage(named: imageName)
        svgImage.size = size
        if let colorToFill = color {
           svgImage.fillColor(color: colorToFill, opacity: opacity)
        }
    
       return svgImage.uiImage
    }
    

    【讨论】:

    • 沙拉德,它看起来不错。在您的上述扩展中,如何为设计师提供的 svg 使用此功能(fillColorForOutter)?
    • 还有一件事,SVGKIT 框架的构建大小会增加多少?
    • 如果您打开 SVG 代码,您可以看到图层。您可以根据需要为图层着色。所以 outerLayer 是少数几个有多层的 SVG 之一,只有在只有一层的情况下才能使用第一个函数。你的设计师会理解的。
    • 我没有检查大小,因为还有其他的豆荚。所以最好安装并存档它。
    • fillColorForSubLayer(layer: CALayer, color: UIColor, opacity: Float) 这个函数有 CALayer 类型参数,那么我该如何传递它。它在 svg 代码中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2022-11-17
    • 2021-11-25
    • 1970-01-01
    • 2018-10-25
    • 2021-10-31
    • 2022-07-11
    相关资源
    最近更新 更多