Как отобразить изображение .svg с помощью swift

У меня есть файл изображения .svg, который я хочу отобразить в своем проекте.

Я попытался использовать UIImageView, который работает для форматов изображений .png и .jpg, но не для расширения .svg. Есть ли способ показать изображение .svg с помощью UIWebView или UIImageView?

Ответы

Ответ 1

Попробуйте этот код

var path: String = NSBundle.mainBundle().pathForResource("nameOfFile", ofType: "svg")!

        var url: NSURL = NSURL.fileURLWithPath(path)  //Creating a URL which points towards our path

       //Creating a page request which will load our URL (Which points to our path)
        var request: NSURLRequest = NSURLRequest(URL: url)
       webView.loadRequest(request)  //Telling our webView to load our above request

Ответ 2

Вы можете использовать SVGKit, например.

1) Включите его в соответствии с инструкциями. Перетащите и удалите файл .framework быстро и легко.

2) Убедитесь, что у вас есть Objective-C для файла моста моста Swift-header.h с кодом импорта:

#import <SVGKit/SVGKit.h>
#import <SVGKit/SVGKImage.h>

3) Используйте фреймворк, подобный этому, считая, что dataFromInternet - это NSData, ранее загруженный из сети:

let anSVGImage: SVGKImage = SVGKImage(data: dataFromInternet)
myIUImageView.image = anSVGImage.UIImage

Структура также позволяет инициализировать SVGKImage из других источников, например, он может загружать изображение для вас, когда вы предоставляете ему URL. Но в моем случае он рушился в случае недостижимого URL-адреса, поэтому оказалось, что лучше управлять сетью самостоятельно. Подробнее об этом здесь.

Ответ 3

версия Swift 3.0:

let path = Bundle.main.path(forResource: "svgNameFileHere", ofType: "svg")!
if path != "" {
    let fileURL:URL = URL(fileURLWithPath: path)
    let req = URLRequest(url: fileURL)
    self.webView.scalesPageToFit = false
    self.webView.loadRequest(req)
}
else {
   //handle here if path not found
}

Ответ 4

В Swift нет встроенной поддержки SVG. Поэтому нам нужно использовать другие библиотеки.

Простые библиотеки SVG в swift:

1) SwiftSVG Библиотека

Это дает вам больше возможностей для импорта в виде UIView, CAShapeLayer, Path и т.д.

Чтобы изменить цвет и импорт SVG в качестве UIImage, вы можете использовать мои коды расширения для библиотеки, указанной в приведенной ниже ссылке,

Нажмите здесь, чтобы узнать об использовании SwiftSVG библиотека:
Использование SwiftSVG для установки SVG для изображения

| ИЛИ |

2) SVGKit Библиотека

2.1) Используйте pod для установки:

pod 'SVGKit', :git => 'https://github.com/SVGKit/SVGKit.git', :branch => '2.x'

2.2) Добавить фреймворк

Перейти к AppSettings
- > Вкладка "Общие"
- > Прокрутить вниз до Связанные рамки и библиотеки
- > Нажмите значок плюс

- > Выберите SVG.framework

2.3) Добавьте в Objective-C в Swift файл моста-bridge.h:

#import <SVGKit/SVGKit.h>
#import <SVGKit/SVGKImage.h>

2.4) Создайте папку SvgImg (для лучшей организации) в Project и добавьте в нее SVG файлы.

Примечание. Добавление внутренних атрибутов Папка не будет работать, и SVGKit ищет файл только в папках проекта

2.5) Используйте в своем Swift-коде, как показано ниже:

import SVGKit

и

let namSvgImgVar: SVGKImage = SVGKImage(named: "NamSvgImj")

Примечание. SVGKit автоматически объявляет расширение ".svg" для указанной вами строки.

let namSvgImgVyuVar = SVGKImageView(SVGKImage: namSvgImgVar)

let namImjVar: UIImage = namSvgImgVar.UIImage

Есть еще много вариантов для инициализации SVGKImage и SVGKImageView

Есть и другие классы, которые вы можете изучить

    SVGRect
    SVGCurve
    SVGPoint
    SVGAngle
    SVGColor
    SVGLength

    and etc ...

Ответ 5

Вы можете сохранить свои изображения в виде строк и использовать WKWebView для их отображения:

let webView: WKWebView = {
    let mySVGImage = "<svg height=\"190\"><polygon points=\"100,10 40,180 190,60 10,60 160,180\" style=\"fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;\"></svg>"
    let preferences = WKPreferences()
    preferences.javaScriptEnabled = false
    let configuration = WKWebViewConfiguration()
    configuration.preferences = preferences
    let wv = WKWebView(frame: .zero, configuration: configuration)
    wv.scrollView.isScrollEnabled = false
    wv.loadHTMLString(mySVGImage, baseURL: nil)
    return wv
}()

Ответ 6

Для рендеринга SVG файла вы можете использовать Macaw. Также Macaw поддерживает преобразования, пользовательские события, анимацию и различные эффекты.

Вы можете отображать SVG файл с нулевыми строками кода. Для получения дополнительной информации ознакомьтесь с этой статьей: Render SVG файл с Macaw.

Ответ 7

Здесь простой класс, который может отображать SVG-изображения в UIView

import UIKit

public class SVGImageView: UIView {
    private let webView = UIWebView()

    public init() {
        super.init(frame: .zero)
        webView.delegate = self
        webView.scrollView.isScrollEnabled = false
        webView.contentMode = .scaleAspectFit
        webView.backgroundColor = .clear
        addSubview(webView)
        webView.snp.makeConstraints { make in
            make.edges.equalTo(self)
        }
    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    deinit {
        webView.stopLoading()
    }

    public func load(url: String) {
        webView.stopLoading()
        if let url = URL(string: fullUrl) {
            webView.loadRequest(URLRequest(url: url))
        }
    }
}

extension SVGImageView: UIWebViewDelegate {
    public func webViewDidFinishLoad(_ webView: UIWebView) {
        let scaleFactor = webView.bounds.size.width / webView.scrollView.contentSize.width
        if scaleFactor <= 0 {
            return
        }

        webView.scrollView.minimumZoomScale = scaleFactor
        webView.scrollView.maximumZoomScale = scaleFactor
        webView.scrollView.zoomScale = scaleFactor
    }
}