WKWebView关于加载SVG图像的思考

前言

最近项目需要加载网络SVG 图像,但是用了一些第三方库效果都很差。大家可以试试加载下面的svg。

SVG SVG

swiftSVG 不支持 
SVGKit 不显示背景色
SnowFlake  显示背景色,不显示文字
Macaw 不显示背景色,展示不全
SwiftDraw 解析错误
SDWebImageSVG 展示不全
pocketSVG 颜色不支持'black',崩溃

这些库加载出来的效果和在浏览器的效果是不一样的,但是这些SVG在安卓上是解析的很好的,我也参考了两个竞品app,发现他们的列表页是不展示的,但是在详情页是展示的,所以我怀疑他们的详情页是用webVIew加载的。

列表页

详情页

但是使用webview加载图像并没有居中平铺

image.png

关于让SVG居中平铺显示参考的是Stack Overflow上一个用户的回答
#WKWebView content is not centered in iOS

通过前端同学的帮助将这个代码改良了一下,通过url加载SVG

NSString *htmlStr = @"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title></title><style type=\"text/css\">html,body {height: 100%;}body {display: flex;justify-content: center;align-items: center;background: url('@') no-repeat center center/contain;}svg {height: 300px;}</style></head><body></body></html>";
NSString *svgHtml = [htmlStr stringByReplacingOccurrencesOfString:@"@" withString:image_url];
题外话
  • 直接使用SDWebImage(因为我们的列表中大部分都是png jpg的图片,只有少部分是SVG)下载svg,然后将xml代码加到HTML body里是否可以?答: 不完全可以。因为有几个SVG的代码放到body里就只能显示文字,例如

    这个
    这个SVG可以在SVGKit中找到

  • 因为还有分享功能,那么WKWebView怎么截屏?用UIGraphicsBeginImageContextWithOptions是绘制不出来的,需要使用 takeSnapshotWithConfiguration

#pragma mark -- WKNavigationDelegate 网页加载完成
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    // 对webview绘制图片,赋值给要分享的imageView中,不然分享还得等webview加载完
    // 这里设置延迟,防止webview还没显示完
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        WKSnapshotConfiguration *snapConfig = [[WKSnapshotConfiguration alloc] init];

        [webView takeSnapshotWithConfiguration:snapConfig completionHandler:^(UIImage * _Nullable snapshotImage, NSError * _Nullable error) {
            self.webViewImage = snapshotImage;
        }];
    });
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,705评论 1 180
  • 通过学习,你将会学习以下几个方面的内容: **什么是WKWebView以及它和UIWebView的区别是什么 **...
    SOI阅读 11,776评论 18 42
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,109评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 6,917评论 0 2