У меня есть собственный WkWebView
, где я устанавливаю height
представления на размер содержимого html.
Это отлично работает, когда я инициализирую его, но проблема возникает, когда я измените source
из WkWebView
на более короткий html.
Я уже сталкивался с этой проблемой в версии android моего приложения, и я исправил это, установка HeightRequest на 0 перед EvaluateJavaScriptAsync
. Таким образом, вид всегда будет увеличиваться.
Я пробовал то же самое с iOS, но он сохраняет самый высокий контент, который у меня был.
Так, например:
Если я установлю в качестве источника WkWebView
файл html высотой 200 пикселей и изменю его на файл html размером 1000 пикселей, он работает нормально, и я могу видеть все содержимое. НО, если я попытаюсь go вернуться к моему файлу размером 200 пикселей html, я получу пустое пространство 800 пикселей внизу и сохраню высоту 1000 пикселей.
Цель состоит в том, чтобы всегда иметь высоту WKWebView
для адаптации к высоте его содержимого.
Вот текущая версия пользовательского рендеринга
namespace MyNamespace.iOS.CustomControl
{
public class AutoHeightWebViewRenderer : WkWebViewRenderer
{
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
try
{
base.OnElementChanged(e);
if (NativeView != null)
{
var webView = (WKWebView)NativeView;
NavigationDelegate = new ExtendedWKWebViewDelegate(this);
}
}
catch (Exception ex)
{
//Log the Exception
}
}
}
class ExtendedWKWebViewDelegate : WKNavigationDelegate
{
AutoHeightWebViewRenderer webViewRenderer;
public ExtendedWKWebViewDelegate(AutoHeightWebViewRenderer _webViewRenderer = null)
{
webViewRenderer = _webViewRenderer ?? new AutoHeightWebViewRenderer();
}
public override async void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
{
try
{
var _webView = webViewRenderer.Element as AutoHeightWebView;
if (_webView != null)
{
_webView.HeightRequest = 0d;
await Task.Delay(300);
var result = await _webView.EvaluateJavaScriptAsync("(function(){return document.body.scrollHeight;})()");
_webView.HeightRequest = Convert.ToDouble(result);
}
}
catch (Exception ex)
{
//Log the Exception
}
}
}
}
РЕДАКТИРОВАТЬ 1: Для большей ясности я могу изменить высоту webview, но я не знаю высоту, потому что он всегда возвращал высоту самого большого html, отображаемого до сих пор. Nomatter, если я использую _webView.EvaluateJavaScriptAsync("(function(){return document.body.scrollHeight;})()")
или webView.ScrollView.ContentSize.Height
.
EDIT 2: Вот небольшой образец, чтобы помочь понять проблему. У меня есть две кнопки и пользовательский веб-просмотр (инициализация с 40 HeightRequest
пустым html). Первая кнопка устанавливает Source
веб-просмотра на 70 пикселей HTML. Второй устанавливает Source
на длину 280 пикселей HTML.
![enter image description here](https://i.stack.imgur.com/XGAyz.png)
В этом примере я нажимаю первую кнопку, а не вторую. one и снова вернитесь к первой кнопке. Вы видите, что веб-просмотр увеличивается с первых 2 кликов. Но тогда веб-просмотр должен уменьшиться, когда я выбираю первый html (переход от 280 пикселей к 70 пикселей), но он сохраняет длину 280 пикселей.
Первая кнопка (длина 70 пикселей)
![enter image description here](https://i.stack.imgur.com/1eEjx.png)
Вторая кнопка (длина 280 пикселей)
![enter image description here](https://i.stack.imgur.com/xLzNc.png)
Вернуться к первой кнопке (длина должна быть 70 пикселей вместо 280 пикселей). ![enter image description here](https://i.stack.imgur.com/Bhwuo.png)
Проблема возникла как на симуляторе, так и на устройстве iOS.