将SVG字符串转换为iOS的UIImage

3

我尝试制作一个 iOS 应用程序,并使用 Github API 以及 SDWebImage。以下是获取“用户个人资料图片”的代码。

[manager GET:@"https://api.github.com/users/(here is your account name)/following?page=1&per_page=100"
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {

         NSArray *array = [NSJSONSerialization JSONObjectWithData:responseObject
                                                          options:NSJSONReadingAllowFragments
                                                            error:nil];
         for (NSDictionary *dic in array) {
             [profileImageArray addObject:[dic valueForKey:@"avatar_url"]];
         }

     }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"Error: %@", error);
     }];

这很顺畅。

然而,当我尝试获取贡献热图像时,我无法得到贡献热图像,因为贡献热图是“SVG字符串”。

贡献热图在这里。

https://qiita-image-store.s3.amazonaws.com/0/19462/43207385-f3e4-1c96-b288-78802beee357.png

然后,在研究之后,我尝试了“SVGKit”,“PocketSVG”,“SKUBezierPath + SVG”等库。但是这些库对于SVG“字符串”而不是SVG“文件”效果不好。

我可以通过使用此URL来获取贡献热图SVG

https://github.com/users/(here is username)/contributions

这是结果。

http://i.imgur.com/pqy1FmO.png

我无法将此响应视为UIImage。我还尝试将responseData更改为NSData并转换UIImage,但它也不能很好地工作。

你能教我如何将“github贡献热图的SVG”处理为UIImage吗?

1个回答

3

SVGgh 包含一个 SVGRenderer 类,它有一个 init 方法——initWithString:(NSString*)anSVG——你可以使用通过这种方式创建的渲染器来告诉 SVGDocumentView 渲染你的 SVG。我编写了 SVGgh。

现在,SVGRenderer 类有一个 -(UIImage*)asImageWithSize:(CGSize)maximumSize andScale:(CGFloat)scale 方法,它将直接创建一个 UIImage。

在您的情况下,似乎您没有得到一个完整的 SVG 文档,因为它缺少其 XML 声明。所以您应该将 block 添加到一个基本的 XML 前缀中,例如在 Swift 中:

let xmlPrefix  = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"
\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">"

let documentString = xmlPrefix + serverImage

let renderer = SVGRenderer(string: documentString)
let image = renderer.asImageWithSize(CGSize(100, 100)), andScale:2.0)

请注意,我使用了\字符来转义所有的引号哈希标记。我没有编译这个片段,所以Swift可能有点偏差。

你好,我想使用你的库,请问所需字符串的格式是什么?能否提供一个示例?谢谢。 - shannoga
格式是SVG文档。因此,您想要获取从服务器获取的字符串中位于<svg></svg>块内的部分,并为其添加XML头。我会稍微编辑我的回复。 - Glenn Howes
这是我做的,但我得到了一个黑色矩形而不是图像(在浏览器上测试正常)。有没有办法可以在笔记中展示我的代码?谢谢。 - shannoga
好的,我添加了一个新问题,附带我的示例代码和SVG字符串。如果您能看一下就太好了。http://stackoverflow.com/questions/36014725/creating-a-uiimage-from-svg-string - shannoga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接