Получить полную высоту содержимого WebView, используя Javascript - PullRequest
9 голосов
/ 05 июня 2010

Я использую UIWebView для отображения контента в форме строки HTML - не веб-сайт, расположенный выше экрана iPhone, без необходимости прокручивать сам веб-вид, оставляя это родительскому scrollView. .

Чтобы добиться этого, мне нужен способ получить общий размер документа, включая прокручиваемую область, для установки высоты webView. Я пробовал несколько различных решений Javascript:

(document.height !== undefined) ? document.height : document.body.offsetHeight // Returns height of UIWebView
document.body.offsetHeight // Returns zero
document.body.clientHeight // Returns zero
document.documentElement.clientHeight // Returns height of UIWebView
window.innerHeight // Returns height of UIWebView -2
document.body.scrollHeight // Returns zero

Есть ли решение, которое действительно работает?

Текущий ( нерабочий ) код:

[[[self.singlePost.contentText subviews] lastObject] setScrollEnabled:NO];
int content_height = [[self.singlePost.contentText stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"] intValue];
NSLog(@"Content_height: %d", content_height);
CGRect rect = self.singlePost.contentText.frame;
rect.size.height = content_height;
self.singlePost.contentText.frame = rect;

Ответы [ 4 ]

18 голосов
/ 17 марта 2013

Нет необходимости использовать Javascript в iOS 5.0 и выше - у вас есть прямой документированный доступ к его scrollView:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    CGFloat contentHeight = webView.scrollView.contentSize.height;
    // ....
}

Чтобы получить общую высоту содержимого веб-вида.

11 голосов
/ 25 ноября 2011

Когда я попытался с моим кодом, я обнаружил, что

(1) NSLog(@"webView height: %@", [webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"]);
(2) NSLog(@"webView height: %@", [webView stringByEvaluatingJavaScriptFromString: @"document.height"]);

(1) возвращает высоту меньше исходной высоты.Но (2) возвращает реальную высоту.Мое предложение состоит в том, чтобы получить Max из двух.

- (void)webViewDidFinishLoad:(UIWebView *)theWebView {
    NSLog(@"Body height: %@", [webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"]);
    NSLog(@"Doc height: %@", [webView stringByEvaluatingJavaScriptFromString: @"document.height"]);
    NSString * javaScript = [NSString stringWithFormat:@"document.getElementById('%@').clientHeight", kDivID];
    NSLog(@"Div height: %@",[webView stringByEvaluatingJavaScriptFromString:javaScript]);
    [self reLayout];
}

- (CGFloat) getWebViewPageHeight {
    CGFloat height1 = [[webView stringByEvaluatingJavaScriptFromString: @"document.height"] floatValue];
    CGFloat height2 = [[webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"] floatValue]; 
    return MAX(height1, height2);   
}

Выход

Body height: 485
Doc height: 509
Div height: 485
6 голосов
/ 07 ноября 2011

Я пошел немного по другому, чтобы создать

, от которого я мог бы отказаться, чтобы получить размер, потому что мне не повезло с проверкой документа / тела.

Это MonoTouch C #, но он должен нормально работать в Objective-C:

private const string DIV_ID = "_uiwebview_";

LoadHtmlString("<body style='background-color:#yourcolor; padding:0px; margin:0px'>" +
  "<div style='width:" + Frame.Width + "px; padding:0px; margin:0px; font-family:" + 
  font.Name + "' id=" + DIV_ID + ">" + html + "</div></body>", base_url);

и получение высоты в LoadFinished:

string sheight = EvaluateJavascript("document.getElementById('" + DIV_ID +
   "').clientHeight");

@ Джесси, это работает при обновлении с HTML, который генерирует меньший размер, чем было показано ранее.

6 голосов
/ 05 июня 2010

Где вы называете свой код? Для меня это возвращает 0, если это вызвано сразу после метода loadHTMLString. Если я вызываю его в (void) webViewDidFinishLoad: (UIWebView *) делегата WebView, я получаю действительное значение.

- (void)loadHTML: (NSString *)html {
    webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    webView.delegate = self;

    NSURL *resourceURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
    [webView loadHTMLString:html baseURL: resourceURL];
    NSLog(@"height: %d", [[webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"] intValue]); // returns 0
  }

- (void)webViewDidFinishLoad:(UIWebView *)theWebView {
    NSLog(@"height: %@", [webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"]); //return 2166
}
...