Изменение размера UIWebView до его содержимого - PullRequest
6 голосов
/ 24 мая 2011

В UITextView я могу изменить высоту элемента управления до его содержимого следующим образом:

CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;
textView.frame = frame;

Но я хочу использовать вместо этого UIWebView для отображения расширенного текста.Содержимое UIWebVie:

NSString *myDescriptionHTML = [NSString stringWithFormat:@"<html> \n"
                                  "<head> \n"
                                  "<style type=\"text/css\"> \n"
                                  "body {font-family: \"%@\"; font-size: %@; }\n"
                                  "</style> \n"
                                  "</head> \n"
                                  "<body>%@</body> \n"
                                  "</html>", @"helvetica",
                                  [NSNumber numberWithInt:12], @"yadayadayada..."];
[webView loadHTMLString:myDescriptionHTML baseURL:nil];

Таким образом, UIWebView содержит только простой текст.Как я могу достичь результата, аналогичного приведенному выше коду UITextView?

Ответы [ 6 ]

14 голосов
/ 05 июня 2011

Хотя теоретически метод JavaScript предоставлен

- (void)webViewDidFinishLoad:(UIWebView *)webview
    CGRect oldBounds = [[self webview] bounds];
    CGFloat height = [[webview stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
    [webview setBounds:CGRectMake(oldBounds.x, oldBounds.y, oldBounds.width, height)];
}

должно работать (и, похоже, работает для большинства людей), это просто не для меня. Я пробовал с несколькими вариантами, и он всегда возвращал размер, который не имеет ничего общего с истинной высотой содержимого. Например, один лайнер будет иметь высоту 260 или 244. Не знаю почему (хотел бы знать).

ТАК, что я закончил, как намекнул этот ответ:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    CGRect frame = aWebView.frame;
    frame.size.height = 1;
    aWebView.frame = frame;
    CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
    frame.size = fittingSize;
    aWebView.frame = frame;

    NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
}

Я думаю, что JS более элегантный, но, черт возьми, он не работает для меня и не может понять, почему, хотя этот метод работал "из коробки".

2 голосов
/ 03 декабря 2013

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

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    // get content size
    CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
    // ajust the height constraint of the webview to the content size
    [self.webviewHeightConstraint setConstant:fittingSize.height];
}
2 голосов
/ 24 мая 2011

Подобно тому, что предложил Мичил, вы сможете получить высоту содержимого, сделав вызов javascript в webViewDidFinishLoad обратном вызове

ex (не проверено) веб-просмотра:

- (void)webViewDidFinishLoad:(UIWebView *)webview
    CGRect oldBounds = [[self webview] bounds];
    CGFloat height = [[webview stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
    [webview setBounds:CGRectMake(oldBounds.x, oldBounds.y, oldBounds.width, height)];
}

Это основано на методе, используемом в Appcelerator Titanium для изменения размера его веб-просмотров на основе высоты, если пользователь устанавливает высоту в «auto» https://github.com/appcelerator/titanium_mobile/blob/master/iphone/Classes/TiUIWebView.m#L616

1 голос
/ 24 мая 2011

Это то, что вы ищете ?? UIScrollView * scroll = [[webView subviews] objectAtIndex: 0]; CGFloat flo = scroll.contentSize.height;

1 голос
/ 24 мая 2011

На этот вопрос нет простого ответа, поскольку UIWebView представляет собой сложное представление прокрутки. Несколько вещей, которые вы можете попробовать, все должно быть сделано после того, как делегат UIWebView получит уведомление о завершении загрузки веб-страницы (используя webViewDidFinishLoad :). Когда делегат узнает, что UIWebView загружен, я бы попробовал это:

  • Попробуйте использовать тот же трюк contentSize, маловероятно, что он будет работать, но может, если страница загружена
  • Получите высоту, используя javascript, например:

    CGFloat windowHeight = [[webView stringByEvaluatingJavaScriptFromString: @ "return document.body.scrollHeight;"] floatValue];

Затем сотворите магию с высотой, как с любым другим видом.

0 голосов
/ 18 сентября 2012

Может быть, сократить код?

_webView.frame = CGRectMake(_webView.frame.origin.x, _webView.frame.origin.y, _webView.frame.size.width, 1);
CGSize fittingSize = [_webView sizeThatFits:CGSizeZero];
_webView.frame = CGRectMake(_webView.frame.origin.x, _webView.frame.origin.y, _webView.frame.size.width, fittingSize.height);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...