0

我正在使用 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];
}

如何获得准确的高度?

提前致谢!

4

3 回答 3

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>

.js文件中

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

在 webView 委托中

- (BOOL)webView:(UIWebView *)source shouldStartLoadWithRequest:(NSURLRequest *)request  navigationType:(UIWebViewNavigationType)navigationType {

    if([[[request URL] absoluteString] hasPrefix:@"invoke"]) {
        [self myFunction];
        return NO;
    }
    return YES;
}
于 2013-05-23T12:10:20.217 回答
2

问题是MathJax 需要一些时间来执行它的动作,并且在MathJax 排版数学之前(即,当它仍然只是一行文本时),您已经获得了新的高度。您必须将新高度与 MathJax 的操作同步。我对 UIWebView 编程一无所知,但你可以让 MathJax 告​​诉你它何时完成排版,包括

<script type="text/x-mathjax-config">
  MathJax.Hub.Queue(function () {alert("done")});
</script>

在加载 MathJax.js 本身的脚本之前的 HTML中。当然,您需要替换alert("done")为与运行 UIWebView 的代码进行通信所需的任何操作(这是我不知道的部分)。你能从外部检测到 UIWebView 内部的事件或值的变化吗?如果是这样,这就是您将在排队的函数中执行的操作,并且您的外部代码需要等待该操作才能更改高度。

于 2013-05-22T21:09:19.997 回答
-1

我通常在加载完成后使用 web 视图的 scrollView contentSize 的高度:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    CGFloat newHeight = aWebView.scrollView.contentSize.height;
}

试试看它是否会为您返回正确的高度。

于 2013-05-22T06:04:26.990 回答