Как определить размер содержимого UIWebView? - PullRequest
116 голосов
/ 14 октября 2010

У меня есть UIWebView с различным (одной страницей) контентом.Я хотел бы узнать CGSize содержимого, чтобы соответствующим образом изменить размеры моих родительских представлений.Очевидное -sizeThatFits:, к сожалению, просто возвращает текущий размер фрейма webView.

Ответы [ 15 ]

2 голосов
/ 30 мая 2014

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

Важным советом оказалось то, что UIWebView не сообщает свой размер правильно, пока не отобразится на экране. Поэтому, когда я загружаю контент, я устанавливаю размер контента на доступную высоту экрана. Затем в viewDidAppear я обновляю размер содержимого scrollview до правильного значения. Это сработало для меня, потому что я вызываю loadHTMLString для локального контента. Если вы используете loadRequest, вам также может понадобиться обновить contentSize в webViewDidFinishLoad, в зависимости от того, насколько быстро извлекается html.

Мерцания нет, потому что изменяется только невидимая часть вида прокрутки.

2 голосов
/ 25 июля 2013

Я использую UIWebView, который не является подпредставлением (и, следовательно, не является частью иерархии окон), чтобы определить размеры содержимого HTML для UITableViewCells.Я обнаружил, что отключенный UIWebView неправильно сообщает свой размер с -[UIWebView sizeThatFits:].Кроме того, как упоминалось в https://stackoverflow.com/a/3937599/9636,, вы должны установить UIWebView 's frame height на 1, чтобы получить нужную высоту вообще.

Если UIWebView'Высота s слишком велика (т. е. у вас установлено значение 1000, но размер содержимого HTML составляет всего 500):

UIWebView.scrollView.contentSize.height
-[UIWebView stringByEvaluatingJavaScriptFromString:@"document.height"]
-[UIWebView sizeThatFits:]

Все возвращают height из 1000.

Для решенияВ этом случае я использовал https://stackoverflow.com/a/11770883/9636,, за который я покорно проголосовал.Однако я использую это решение только в том случае, если мой UIWebView.frame.width совпадает с -[UIWebView sizeThatFits:] width.

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

Xcode8 swift3.1:

  1. Сначала установите высоту webView в 0 .
  2. В webViewDidFinishLoad Делегат:

let height = webView.scrollView.contentSize.height

Без шага 1, если webview.height> фактический contentHeight, шаг 2 вернет webview.height, но не contentsize.height.

1 голос
/ 25 июля 2015

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

Код очень прост:

-(void)webViewDidFinishLoad:(UIWebView *)webView
{

    //tell the width first
    webView.width = [UIScreen mainScreen].bounds.size.width;

    //use js to get height dynamically
    CGFloat scrollSizeHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
    webView.height = scrollSizeHeight;

    webView.x = 0;
    webView.y = 0;

    //......
}
0 голосов
/ 01 апреля 2014

Также в iOS 7 для правильной работы всех упомянутых методов добавьте это в свой контроллер представления viewDidLoad метод:

if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

В противном случае ни один из методов не будет работать так, как должен.

...