使用mathjax时,UIWebView的内容高度返回错误的值

时间:2013-05-22 05:00:04

标签: iphone ios objective-c ipad mathjax

我使用mathjax在UIWebView上显示数学表达式。所以我想动态更改UIWebView高度。为此,我使用了

CGFloat newHeight = [[self.questionWebView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight;"] floatValue];

webViewDidFinishLoad:委托方法中。

我的问题是,如果我使用正常表达式,UIWebView高度将返回正确的值,如下图所示,

enter image description here

如果我输入包含 /,(,)的表达式,它将给出错误的高度,如下图所示

enter image description here

 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];
}

如何获得准确的高度?

提前致谢!

3 个答案:

答案 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文件

中添加了objective-c方法调用
<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;
}

尝试一下,看看它是否为您返回正确的高度。