Using Macaw its pretty straight forward to use SVG images in your iOS and macOS apps.
Install via CocoaPods or Carthage. It doesn't support SPM at the time of writing but its pretty easy to fork their repo and add it.
import UIKit
import Macaw
// TODO: Add Caching
extension UIImage {
convenience init? (svgString: String, size: CGSize) {
guard let node = try? SVGParser.parse(fullPath: svgString) else { return nil }
self.init(node: node, size: size)
}
convenience init? (svgFile: String, size: CGSize) {
guard let node = try? SVGParser.parse(resource: svgFile) else { return nil }
self.init(node: node, size: size)
}
fileprivate convenience init? (node: Node, size: CGSize) {
guard let cgImage = node.toNativeImage(size: size.toMacaw()).cgImage else { return nil }
self.init(cgImage: cgImage)
}
}
// Usage
let image = UIImage(svgString: "....")
import Cocoa
import Macaw
// TODO: Add Caching
extension NSImage {
convenience init? (svgString: String, size: CGSize) {
guard let node = try? SVGParser.parse(fullPath: svgString) else { return nil }
self.init(node: node, size: size)
}
convenience init? (svgFile: String, size: CGSize) {
guard let node = try? SVGParser.parse(resource: svgFile) else { return nil }
self.init(node: node, size: size)
}
fileprivate convenience init? (node: Node, size: CGSize) {
guard let cgImage = node.toNativeImage(size: size.toMacaw()).cgImage(forProposedRect: nil, context: nil, hints: nil) else { return nil }
self.init(cgImage: cgImage, size: size)
}
}
// Usage
let image = NSImage(svgString: "....")
import SwiftUI
#if os(iOS)
import UIKit
#elseif os(macOS)
import Cocoa
#endif
// TODO: Add Caching
extension Image {
convenience init? (svgString: String, size: CGSize) {
guard let node = try? SVGParser.parse(fullPath: svgString) else { return nil }
self.init(node: node, size: size)
}
convenience init? (svgFile: String, size: CGSize) {
guard let node = try? SVGParser.parse(resource: svgFile) else { return nil }
self.init(node: node, size: size)
}
#if os(iOS)
fileprivate convenience init? (node: Node, size: CGSize) {
let native = node.toNativeImage(size: size.toMacaw())
self.init(uiImage: native)
}
#elseif os(macOS)
fileprivate convenience init? (node: Node, size: CGSize) {
let native = node.toNativeImage(size: size.toMacaw())
self.init(nsImage: native)
}
#endif
// Usage
GeometryReader { geometry in
Image(svgString: "...", size: geometry.size)
.resizable()
.aspectRatio(contentMode: .fit)
}