Skip to content

Instantly share code, notes, and snippets.

@bok-
Created September 11, 2019 01:45
Show Gist options
  • Save bok-/5ec5b9f45adf221edff23e11c08a01e3 to your computer and use it in GitHub Desktop.
Save bok-/5ec5b9f45adf221edff23e11c08a01e3 to your computer and use it in GitHub Desktop.
SVG Images with Macaw

SVG Images with Macaaw

Using Macaw its pretty straight forward to use SVG images in your iOS and macOS apps.

Installation

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.

Usage

iOS

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: "....")

macOS

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: "....")

SwiftUI

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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment