Конвертировать SVG Node (Macaw) в NSImage Swift4 / Cocoa - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь конвертировать из Macaw SVG (Node) в NSImage.Я смог найти пример кода для IOS на форуме Macaw, но не смог заставить его работать в Какао.

В библиотеках Macaw есть ссылки на все отсутствующие функции (UIGraphicsBeginImageContext и т. Д.) В виде MGraphicsBeginImageContext, но пока не удалось получить к ним доступ (использование неразрешенного идентификатора 'UIGraphicsBeginImageContext')

Здесьобразец кода из оригинальной статьи https://github.com/exyte/Macaw/pull/382#issuecomment-393422770

func svgToImge(resourceName: String, size: CGSize) -> NSImage {
        if let rootNode = try? SVGParser.parse(path: resourceName)
        {
            let macawView = MacawView(node: rootNode, frame:CGRect(origin: CGPoint.zero, size: size))
            UIGraphicsBeginImageContext(size)
            macawView.layer.render(in: UIGraphicsGetCurrentContext()!)
            let img =  UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            return img!
        } else {
            return NSImage()
        }
    }

1 Ответ

0 голосов
/ 10 октября 2018

Вот откорректированный код, предоставленный создателями Macaw, который, кажется, решает проблему.Мне нужно было добавить инвертор, поскольку изображение рисовалось вверх ногами, и их первоначальное предложение NSGraphicsContext.current? .GraphicsPort не казалось стабильным / надежным, и я в итоге использовал NSGraphicsContext.current? .CgContext вместо:

func svgToNSImage(resourcePath: String, size: CGSize) -> NSImage? {

   if let rootNode = try? SVGParser.parse(path: resourcePath) {

        let macawView = MacawView(node: rootNode, frame: CGRect(origin: CGPoint.zero, size: size))
        macawView.wantsLayer = true

        let image = NSImage(size: macawView.bounds.size)
        image.lockFocus()

        //        if let ctx = NSGraphicsContext.current?.graphicsPort {
        if let ctx = NSGraphicsContext.current?.cgContext {
            // image is drawing upside down, invert it and render
            ctx.translateBy(x: 0, y: size.height)
            ctx.scaleBy(x: 1.0, y: -1.0)
            macawView.layer?.render(in: ctx)
        }
        image.unlockFocus()
        return image

    } else { return nil }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...