У меня есть UIWebView
другой (одностраничный) контент. Я хотел бы узнать CGSize
содержание, чтобы изменить размер моих родительских представлений соответствующим образом. К -sizeThatFits:
сожалению, очевидное просто возвращает текущий размер кадра webView.
116
Ответы:
Оказалось, что мое первое предположение об использовании
-sizeThatFits:
не было полностью ошибочным. Кажется, это работает, но только в том случае, если перед отправкой фрейм webView установлен на минимальный размер-sizeThatFits:
. После этого мы сможем исправить неправильный размер кадра на подходящий размер. Звучит ужасно, но на самом деле не так уж и плохо. Поскольку оба кадра меняются сразу после друг друга, вид не обновляется и не мерцает.Конечно, нам нужно дождаться загрузки содержимого, поэтому мы помещаем код в
-webViewDidFinishLoad:
метод делегата.Obj-C,
Swift 4.x
Я должен указать на другой подход (спасибо @GregInYEG) с использованием JavaScript. Не уверен, какое решение работает лучше.
Из двух хакерских решений мне больше нравится это.
источник
UIWebView
представление выше родительского, вам нужно встроить его в файлUIScrollView
.У меня есть другое решение, которое отлично работает.
С одной стороны, подход и решение Ortwin работают только с iOS 6.0 и новее, но не работают корректно с iOS 5.0, 5.1 и 5.1.1, а с другой стороны, есть кое-что, что мне не нравится и что я не могу понять. с подходом Ортвина это использование метода
[webView sizeThatFits:CGSizeZero]
с параметромCGSizeZero
: если вы читаете официальную документацию Apple об этих методах и их параметрах, там ясно сказано:Я имею в виду, что он как будто наткнулся на свое решение без какой-либо логики, потому что, читая документацию, переданный параметр
[webView sizeThatFits: ...]
должен, по крайней мере, иметь желаемоеwidth
. В его решении желаемая ширина устанавливается дляwebView
рамки перед вызовомsizeThatFits
сCGSizeZero
параметром. Я утверждаю, что это решение работает на iOS 6 «случайно».Я придумал более рациональный подход, преимущество которого заключается в работе с iOS 5.0 и более поздних версий ... А также в сложных ситуациях, когда более одного webView (его свойство
webView.scrollView.scrollEnabled = NO
встроено в файлscrollView
.Вот мой код, чтобы заставить Макет
webView
желаемогоwidth
и вернуть соответствующийheight
набор обратно вwebView
себя:Obj-C,
Swift 4.x
Обратите внимание , что в моем примере,
webView
был встроен в обычай ,scrollView
имеющий другоеwebViews
... Все этоwebViews
было ихwebView.scrollView.scrollEnabled = NO
, и последний кусок кода , который я должен был добавить был вычислениеheight
изcontentSize
моего обычаяscrollView
вложения ихwebViews
, но это было так легко а суммируя мойwebView
«ыframe.size.height
вычисляется с помощью трюка описано выше ...источник
-[UIWebView scrollView]
доступно только в iOS 5.0 или новее.Воскрешая этот вопрос, потому что я обнаружил, что ответ Ортвина работает только в большинстве случаев ...
webViewDidFinishLoad
Метод может быть вызван более чем один раз, и первое значение , возвращаемоеsizeThatFits
только некоторая часть того , что конечный размер должен быть. Тогда по какой-то причине следующий вызовsizeThatFits
whenwebViewDidFinishLoad
снова срабатывает, он неверно вернет то же значение, что и раньше! Это произойдет случайным образом для одного и того же контента, как если бы это была какая-то проблема параллелизма. Возможно, это поведение изменилось со временем, потому что я работаю для iOS 5 и также обнаружил, что онsizeToFit
работает примерно так же (хотя раньше этого не было?)Я остановился на этом простом решении:
Swift (2.2):
Обновление: я обнаружил, что, как упоминалось в комментариях, это не похоже на случай, когда контент сократился. Не уверен, что это верно для всего контента и версии ОС, попробуйте.
источник
webView.scalesPageToFit = YES
указываете как @Sijo, упомянутый в комментарии выше.В Xcode 8 и iOS 10 для определения высоты веб-представления. вы можете получить высоту, используя
ИЛИ для Swift
источник
Простым решением было бы просто использовать,
webView.scrollView.contentSize
но я не знаю, работает ли это с JavaScript. Если не используется JavaScript, это наверняка работает:источник
AFAIK вы можете использовать,
[webView sizeThatFits:CGSizeZero]
чтобы выяснить размер содержимого.источник
Это странно!
Я тестировал оба решения,
sizeThatFits:
и[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]
они НЕ работают для меня.Однако я нашел интересный простой способ получить правильную высоту содержания веб-страницы. В настоящее время я использовал его в своем методе делегата
scrollViewDidScroll:
.Проверено в iOS 9.3 Симулятор / Устройство, удачи!
РЕДАКТИРОВАТЬ:
Справочная информация: содержимое html рассчитывается моей строковой переменной и шаблоном содержимого HTTP, загруженным методом
loadHTMLString:baseURL:
, без зарегистрированных сценариев JS.источник
Для iOS10 я получал значение 0 (ноль),
document.height
поэтомуdocument.body.scrollHeight
это решение для получения высоты документа в Webview. Проблема может быть решена также дляwidth
.источник
Я использую объект,
UIWebView
который не является подпредставлением (и, следовательно, не является частью иерархии окон), чтобы определить размеры содержимого HTMLUITableViewCells
. Я обнаружил, что отключенныйUIWebView
не сообщает свой размер должным образом с помощью-[UIWebView sizeThatFits:]
. Кроме того, как указано в https://stackoverflow.com/a/3937599/9636 , вы должны установитьUIWebView
«Sframe
height
до 1, чтобы получить правильную высоту на всех.Если
UIWebView
высота слишком велика (т. Е. У вас установлено значение 1000, но размер содержимого HTML составляет всего 500):Все возвращают
height
1000.Чтобы решить свою проблему в этом случае, я использовал https://stackoverflow.com/a/11770883/9636 , за который послушно проголосовал. Однако я использую это решение только тогда, когда у меня
UIWebView.frame.width
такое же, как у-[UIWebView sizeThatFits:]
width
.источник
Ни одно из предложенных здесь предложений не помогло мне в моей ситуации, но я прочитал кое-что, что дало мне ответ. У меня есть ViewController с фиксированным набором элементов управления пользовательского интерфейса, за которым следует UIWebView. Я хотел, чтобы вся страница прокручивалась, как если бы элементы управления пользовательского интерфейса были подключены к содержимому HTML, поэтому я отключил прокрутку в UIWebView и затем должен правильно установить размер содержимого родительского представления прокрутки.
Важным советом оказалось то, что UIWebView не сообщает свой размер правильно до тех пор, пока не отобразится на экране. Поэтому, когда я загружаю контент, я устанавливаю размер контента на доступную высоту экрана. Затем в viewDidAppear я обновляю размер содержимого scrollview до правильного значения. У меня это сработало, потому что я вызываю loadHTMLString для локального контента. Если вы используете loadRequest, вам может потребоваться обновить contentSize в webViewDidFinishLoad, в зависимости от того, как быстро извлекается html.
Мерцания нет, потому что изменяется только невидимая часть прокрутки.
источник
webViewDidFinishLoad
безопасный подход.Если ваш HTML -код содержит тяжелое HTML-содержимое, такое как iframe (например, facebook-, twitter, instagram-embeds), реальное решение намного сложнее, сначала оберните свой HTML:
Затем добавьте обработку x-update-webview-height -scheme в свой shouldStartLoadWithRequest :
И, наконец, добавьте следующий код в свой layoutSubviews :
PS Вы можете реализовать временную задержку (SetTimeout и setInterval) внутри вашего ObjectiveC / Swift-кода - решать вам.
PSS Важная информация о UIWebView и Facebook Embeds: встроенная публикация Facebook не отображается должным образом в UIWebView
источник
При использовании веб-просмотра в качестве подпредставления где-то в режиме прокрутки вы можете установить ограничение высоты на некоторое постоянное значение, а затем сделать выход из него и использовать его как:
источник
Я тоже застрял в этой проблеме, затем я понял, что если я хочу вычислить динамическую высоту webView, мне нужно сначала указать ширину webView, поэтому я добавляю одну строку перед js, и оказывается, что я могу получить очень точная фактическая высота.
Код такой простой:
источник
Xcode8 swift3.1:
webViewDidFinishLoad
делегате:let height = webView.scrollView.contentSize.height
Без шага 1, если webview.height> фактического contentHeight, шаг 2 вернет webview.height, но не contentsize.height.
источник
Также в iOS 7 для правильной работы всех упомянутых методов добавьте это в свой
viewDidLoad
метод контроллера представления :В противном случае ни один из методов не работал бы должным образом.
источник