一般都是用 webview 加载数学公式。
latex 公式
如果确定数学公式是 latex 的表达式,可以使用以下方式显示:
示例:
//latex 表达式
NSString *latex = @"a_{ij}^{2} + b^3_{2}=x^{t} + y' + x''_{12}";
NSString *latexHTML = [NSString stringWithFormat:@"",latex];
[_webView loadHTMLString:latexHTML baseURL:nil];
加载结果:
latex.png
其他格式的数学公式
如果后台返回的是 HTML 的标签,我们也可以直接用 webview 来加载,但是需要加载一个 mathjax 插件,用这个插件来解析数学公式
示例:
//HTML 代码
下列五个关系中,正确的个数为( )
①$\frac{7}{2} \in R$ ②$\sqrt{2} \notin Q$
③$π \in Q$ ; ④ $|-3|\notin N$ ;
⑤ $-\sqrt{4} \in Z$.
NSString *htmlStr = @"";//使用以上HTML代码
//加载 MathJax插件 js代码
NSString *scripStr = @"";
htmlStr = [NSString stringWithFormat:@"%@%@",htmlStr,scripStr];
[_webView loadHTMLString:htmlStr baseURL:nil];
加载结果:
html
webview 配置
用 webview 加载数学公式的时候,因为展示的就是一张图片,如果发现图片比较小,可以为图片标签注入一些样式:
NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width','initial-scale=0.9','user-scalable=no');meta.setAttribute('user-scalable','no');document.getElementsByTagName('head')[0].appendChild(meta); var imgs = document.getElementsByTagName('img');for (var i in imgs){imgs[i].style.maxWidth='100%';imgs[i].style.height='auto';};";
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
WKUserContentController *wkUController = [[WKUserContentController alloc] init];
[wkUController addUserScript:wkUScript];
WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
wkWebConfig.userContentController = wkUController;
_webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:wkWebConfig];
webview 高度动态获取
加载数学公式的时候,我们可以等待公式加载完成之后,动态的通过webview的代理获取高度,从而重新布局。
具体方法:
在 webview 加载完成之后,在 WKNavigationDelegate 这个代理中的以下代理方法,运行一段 js 代码,获取高度:
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
[webView evaluateJavaScript:@"document.body.scrollHeight;" completionHandler:^(id _Nullable any, NSError * _Nullable error) {
CGFloat webviewHeight = [[NSString stringWithFormat:@"%@",any] floatValue];
}];
}