iOS Swift将SVG图像添加到Android按钮

时间:2017-08-15 14:04:55

标签: android ios swift image svg

在Android中,我们可以将SVG导入为Vector XML, 使用它作为Drawable, 更改SVG图标的颜色并添加到按钮

void setSvgIcnForBtnFnc(Button setBtnVar, int setSvgVar, int setClrVar, String PosVar)
{
    Drawable DevDmjVar = getDrawable(setSvgVar);
    DevDmjVar.setBounds(0,0,Dpx24,Dpx24);
    DevDmjVar.setColorFilter(new PorterDuffColorFilter(setClrVar, PorterDuff.Mode.SRC_IN));
    switch (PosVar)
    {
        case "Tit" : setBtnVar.setCompoundDrawables(null, DevDmjVar, null, null); break;
        case "Rit" : setBtnVar.setCompoundDrawables(null, null, DevDmjVar, null); break;
        case "Pit" : setBtnVar.setCompoundDrawables(null, null, null, DevDmjVar); break;
        default: setBtnVar.setCompoundDrawables(DevDmjVar, null, null, null); break;
    }
}

如何在swift for iphone中执行此操作?

setBtnVar.setImage(<image: UIImage?>, forState: <UIControlState>)

5 个答案:

答案 0 :(得分:8)

UPD :另请参阅此UseYourLoaf blog post

刚刚在Erica Sadun blog post找到 iOS 11 could use Vector Assets

什么&#34;矢量资产&#34;意味着:

  

如果单击该框,矢量数据将随您一起提供   应用。一方面,这使您的应用程序变得有点   比较大,因为矢量数据占用了一些空间。但就此而言   另一方面,会给你机会扩展这些图像,其中   可能在许多不同的情况下都很有用。所以,一个是,如果   你知道这个特定的图像将在多个时使用   大小。但这可能不太明显。所以,一个案例是象征性的   应使用动态类型调整大小的字形。因为我们正在思考   动态类型,你也应该考虑有字形   出现在类型旁边适当调整大小。另一个案例   真的不明显,是标签栏图片。   ...我们非常强大的可访问性功能   建议支持,允许已经转为他们的用户   动态类型大小。 ...因此,我们建议您这样做,以提高应用在所有用户中的可用性

使用方法:

  1. 将您的SVG文件转换为PDF,例如在ZamZar.com
  2. 将您的pdf添加到Assets.xcassets
    • 点击&#34;保存矢量数据&#34;对于导入的pdf。
  3. UIImageView中创建UIViewController,并指定UIImage等pdf文件。
  4. Mac App Store中提供的

    Asset Catalog Creator只需拖放即可完成第1步和第2步。

    iOS&lt; 11

    没有使用SVG图像的原生方式。

    查看Macaw

    通过Cocoapod

    导入框架
    pod "Macaw", "0.8.2"
    

    检查他们的example project:这是您呈现tiger.svg的方式(位于项目目录中,而不是Assets.xcassets文件中)

    import UIKit
    import Macaw
    
    class SVGExampleView: MacawView {
    
        required init?(coder aDecoder: NSCoder) {
            super.init(node: SVGParser.parse(path: "tiger"), coder: aDecoder)
        }
    
    }
    

    当然还有其他一些第三方库:

答案 1 :(得分:2)

经过一场噩梦之后,我想出了使用Swift在按钮中使用SVG的解决方案。 这适合所有不想像我一样挣扎的人

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

用法:

namBtnVar.setSvgImgFnc("ikn_sev", ClrVar: UIColor.cyanColor())

安装SwiftSVG图书馆

1)使用pod安装:

//对于Swift 3

pod 'SwiftSVG'

//适用于Swift 2.3

pod 'SwiftSVG', '1.1.5'

2)添加框架

  

转到AppSettings
       - &GT;常规标签
       - &GT;向下滚动到链接的框架和库        - &GT;点击加号图标
       - &GT;选择SVG.framework

3)在项目的任何地方添加以下代码

extension UIButton
{
    func setSvgImgFnc(svgImjFileNameVar: String, ClrVar: UIColor)
    {
        setImage((getSvgImgFnc(svgImjFileNameVar, ClrVar : ClrVar)), forState: .Normal)
    }
}

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!
    }
}

答案 2 :(得分:1)

如果您在导入后为比例因子选择单一比例,则可以原生使用基于矢量的PDF。

PDF的尺寸将是资产的 1x 尺寸。

Xcode将为每个比例生成光栅化图像。然后,您可以像使用任何其他图像一样使用它。

答案 3 :(得分:0)

我用了Aleksey Potapov的答案。转换和一切都完美! 但是我遇到了一个问题,就是我的图像对于我的应用程序来说太大了。

因此,使用它可以将其调整为适合iOS开发的大小:

<svg xmlns="http://www.w3.org/2000/svg" height="30" width="30" viewBox="0 0 1000 1000" xmlns:xlink="http://www.w3.org/1999/xlink">

答案 4 :(得分:0)

查看我的应用:Speculid 它将根据您的资产库的设置自动将SVG转换为PDF或PNG。