我使用mathjax在UIWebView
上显示数学表达式。所以我想动态更改UIWebView
高度。为此,我使用了
CGFloat newHeight = [[self.questionWebView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight;"] floatValue];
在webViewDidFinishLoad:
委托方法中。
我的问题是,如果我使用正常表达式,UIWebView
高度将返回正确的值,如下图所示,
如果我输入包含 /,(,)的表达式,它将给出错误的高度,如下图所示
NSString *html = [NSString stringWithFormat:@"<html><head><title>Untitled</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /><script type=\"text/x-mathjax-config\">MathJax.Hub.Config({extensions: [\"tex2jax.js\"],jax: [\"input/TeX\",\"output/HTML-CSS\"],tex2jax: {inlineMath: [[\"$\",\"$\"],[\"\\(\",\"\\)\"]]}});</script><script type=\"text/javascript\" src=\"../MathJax.js?config=AM_HTMLorMML-full\"></script></head><style>.Question {font-family:'Times New Roman',arial;font-weight:normal;font-size:12px;color:#323232;}</style><body><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"Question\" align=\"left\" width=\"260\" height=\"40\"><tr><td> `x + 3 = 2` </td></tr></div></body></html>"];
[self writeStringToFile:tempDir fileName:@"test1.html" pathName:filePath content:html];
NSURLRequest* req = [[NSURLRequest alloc] initWithURL:url];
[self.myWebView loadRequest:req];
在writeStringToFile:
方法中,
-(void)writeStringToFile:(NSString *)dir fileName:(NSString *)strFileName pathName:(NSString *)strPath content:(NSString *)strContent{
NSString *path = [dir stringByAppendingPathComponent:strFileName];
NSString *foo0 = @"<html><head><meta name='viewport' content='initial-scale=1.0;maximum-scale=100.0;user-scalable=1'/>"
"<script type='text/javascript' src='";
NSString *foo1 = @"?config=AM_HTMLorMML-full'></script>"
"</head>"
"<body>";
NSString *foo2 = @"</body></html>";
NSString *fooFinal = [NSString stringWithFormat:@"%@%@%@%@%@",foo0,strPath,foo1,strContent,foo2];
[fooFinal writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
如何获得准确的高度?
提前致谢!
答案 0 :(得分:2)
问题在于MathJax需要一些时间来执行其操作,并且在MathJax排版数学之前(即,当它仍然只是一行文本时),您将获得新的高度。您必须将新高度与MathJax的操作同步。我对UIWebView编程一无所知,但您可以通过包含
让MathJax告诉您何时完成排版?<script type="text/x-mathjax-config">
MathJax.Hub.Queue(function () {alert("done")});
</script>
在之前的中加载MathJax.js本身的脚本。当然,您需要将alert("done")
替换为与运行UIWebView的代码进行通信所需的任何操作(这是我不知道的部分)。你能从外面检测UIWebView中的事件或值的变化吗?如果是这样,那就是你在排队的函数中要做的事情,你的外部代码需要在更改高度之前等待该操作。
答案 1 :(得分:2)
经过长时间的研究,我在@Davide Cervone答案和样本https://github.com/dannywartnaby/KPWebViewInterceptor的帮助下找到了解决方案,
刚刚在.html
文件
<script type="text/x-mathjax-config">
MathJax.Hub.Queue(function myFunction() {
objc_msgsend('myFunction');
});
</script>
<{1>}文件中的
.js
webView Delegate中的
var KP_INTERCEPTOR_INVOCATION_COMMAND = "invoke"
var KP_INTERCEPTOR_SEPERATOR = ":"
function objc_msgsend() {
var selector = arguments[0];
var invocation = selector;
if ( arguments.length > 1 ) {
for( var i = 1; i < arguments.length; i++ ) {
invocation = invocation + KP_INTERCEPTOR_SEPERATOR + arguments[i];
}
}
window.location = KP_INTERCEPTOR_INVOCATION_COMMAND + KP_INTERCEPTOR_SEPERATOR + invocation;
}
答案 2 :(得分:-1)
我通常在完成加载后使用web视图的scrollView contentSize的高度:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
CGFloat newHeight = aWebView.scrollView.contentSize.height;
}
尝试一下,看看它是否为您返回正确的高度。