【问题标题】:Swift SVG Fil Color to SVGImageSwift SVG 填充颜色到 SVG 图像
【发布时间】:2017-08-16 15:24:14
【问题描述】:

我正在使用 SVGKit 来显示图像

https://github.com/SVGKit/SVGKit/

如何为 SVGImage 应用填充颜色

let namSvgImgVar = SVGKImage(named: namSvgImg)
namSvgImgVar.setFilColor()

想实现这个setFilColor函数

【问题讨论】:

    标签: ios swift image svg svgkit


    【解决方案1】:

    Wish Swift 在其下一个版本中添加此功能

    在一场噩梦之后,我想出了这个
    在 Swift 中使用 SVG 的解决方案,它自动适合视图,并且只需一行代码即可为其添加填充颜色

    这是给所有不想像我一样挣扎的人

    |*|用法:

    let svgImgVar = getSvgImgFnc("svgImjFileName", ClrVar : ClrVar)
    
    // Can use this Image anywhere in your code
    

    |*|步骤:

    我使用简单的 SwiftSVG 库从 SVG 文件中获取 UIView

    |*|安装 SwiftSVG

    1) 使用pod安装:

    // 对于 Swift 3

    pod 'SwiftSVG'
    

    // 对于 Swift 2.3

    pod 'SwiftSVG', '1.1.5'
    

    2) 添加框架

    转到应用设置
    -> 常规选项卡
    -> 向下滚动到链接的框架和库
    -> 点击加号图标
    -> 选择 SVG.framework

    3) 在项目中的任意位置添加以下代码

    func getSvgImgFnc(svgImjFileNameVar: String, ClrVar: UIColor) -> UIImage
    {
        let svgURL = NSBundle.mainBundle().URLForResource(svgImjFileNameVar, withExtension: "svg")
        let svgVyuVar = UIView(SVGURL: svgURL!)
    
        /* The width, height and viewPort are set to 100 
    
            <svg xmlns="http://www.w3.org/2000/svg"
                width="100%" height="100%"
                viewBox="0 0 100 100">
    
            So we need to set UIView Rect also same
        */
    
        svgVyuVar.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        for svgVyuLyrIdx in svgVyuVar.layer.sublayers!
        {
            for subSvgVyuLyrIdx in svgVyuLyrIdx.sublayers!
            {
                if(subSvgVyuLyrIdx.isKindOfClass(CAShapeLayer))
                {
                    let SvgShpLyrIdx = subSvgVyuLyrIdx as? CAShapeLayer
                    SvgShpLyrIdx!.fillColor = ClrVar.CGColor
                }
            }
        }
        return svgVyuVar.getImgFromVyuFnc()
    }
    
    extension UIView
    {
        func getImgFromVyuFnc() -> UIImage
        {
            UIGraphicsBeginImageContext(self.frame.size)
    
            self.layer.renderInContext(UIGraphicsGetCurrentContext()!)
            let image = UIGraphicsGetImageFromCurrentImageContext()
    
            UIGraphicsEndImageContext()
            return image!
        }
    }
    

    【讨论】:

    • 嗨@Sujay,我在控制台中遇到错误。请让我知道解决方案。不支持线性渐变。有关受支持元素的完整列表,请参阅 SVGParserSupportedElements 结构中的 allSupportElements 变量。单击elementName 变量名称以查看 SVG 标记名称。
    • 这是控制台中的另一个错误。不支持停止。有关受支持元素的完整列表,请参阅 SVGParserSupportedElements 结构中的 allSupportElements 变量。单击elementName 变量名称以查看 SVG 标记名称。
    • Sujay,此代码在 swift 5 中不起作用。请将您的代码 sn-p 转换为 swift-5
    • @NarasimhaNallamsetty 你找到解决这个错误的办法了吗
    【解决方案2】:

    如果您有 SVG 图像的任何 ID,则可以根据 ID 填充颜色。

        let image = SVGKImage(named: "iconName")
        let svgIMGV = SVGKFastImageView(frame: self.imgView.frame)
             svgIMGV.image = image
              svgIMGV.fillTintColor(colorImage: UIColor.red, iconID: "Bank")
    
    // Add in extension SVGKImageView
    extension SVGKImageView {
     func fillTintColor(colorImage: UIColor, iconID: String) {
            if self.image != nil && self.image.caLayerTree != nil {
                print(self.image.caLayerTree.sublayers)
                guard let sublayers = self.image.caLayerTree.sublayers else { return }
                fillRecursively(sublayers: sublayers, color: colorImage, iconID: iconID)
            }
        }
    
         private func fillRecursively(sublayers: [CALayer], color: UIColor, iconID: String, hasFoundLayer: Bool) {
            var isLayerFound = false
            for layer in sublayers {
                if let l = layer as? CAShapeLayer {
    
                    print(l.name)                
                    //IF you want to color the specific shapelayer by id else remove the l.name  == "myID"  validation
                    if let name =  l.name,  hasFoundLayer == true && name == "myID" {
                        self.colorThatImageWIthColor(color: color, layer: l)
                        print("Colouring FInished")
                    }
                } else {
                    if layer.name == iconID {
                        if let innerSublayer = layer.sublayers as? [CAShapeLayer] {
                            fillRecursively(sublayers: innerSublayer, color: color, iconID: iconID, hasFoundLayer: true )
                            print("FOund")
                        }
                    } else {
                        if let l = layer as? CALayer, let sub = l.sublayers {
                            fillRecursively(sublayers: sub, color: color, iconID: iconID, hasFoundLayer: false)
                        }
                    }
                }
    
            }
        }
    
        func colorThatImageWIthColor(color: UIColor, layer: CAShapeLayer) {
            if layer.strokeColor != nil {
                layer.strokeColor = color.cgColor
            }
            if layer.fillColor != nil {
                layer.fillColor = color.cgColor
            }
        }
    
    }
    

    【讨论】:

    • 欢迎来到 SO,添加代码来支持您的答案是很好的,还可以添加一些解释,这将有助于 SO 成员,并且答案将受到好评。
    猜你喜欢
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2016-07-30
    相关资源
    最近更新 更多