Размер Xamarin Forms WKWebView не уменьшается - PullRequest
0 голосов
/ 08 мая 2020

У меня есть собственный 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

В этом примере я нажимаю первую кнопку, а не вторую. one и снова вернитесь к первой кнопке. Вы видите, что веб-просмотр увеличивается с первых 2 кликов. Но тогда веб-просмотр должен уменьшиться, когда я выбираю первый html (переход от 280 пикселей к 70 пикселей), но он сохраняет длину 280 пикселей.

Первая кнопка (длина 70 пикселей)
enter image description here

Вторая кнопка (длина 280 пикселей)
enter image description here

Вернуться к первой кнопке (длина должна быть 70 пикселей вместо 280 пикселей). enter image description here

Проблема возникла как на симуляторе, так и на устройстве iOS.

Ответы [ 2 ]

1 голос
/ 11 мая 2020

Вы можете изменить Frame из webView, чтобы изменить height.

public override async void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
{
    try
    {
        var _webView = webViewRenderer.Element as WebView;
        if (_webView != null)
        {

            webView.Frame = new CGRect(webView.Frame.Location, new CGSize(webView.Frame.Size.Width, 0));

            var a = webView.ScrollView.ContentSize.Height;
            var b = await _webView.EvaluateJavaScriptAsync("(function(){return document.body.scrollHeight;})()");

            Console.WriteLine(a);
            Console.WriteLine(b);

            CGRect tempRect = webView.Frame;

            // for test                    
            webView.Frame = new CGRect(tempRect.Location.X, tempRect.Location.Y, tempRect.Size.Width, float.Parse(b));

        }
    }
    catch (Exception ex)
    {
        //Log the Exception 
    }
}
0 голосов
/ 16 июня 2020

У меня была такая же проблема, и CustomNavigationDelegate также показывал только тот же большой размер, который был размером дисплея устройства.

Я обнаружил, что установил это в части инициализации XAML и кода позади , который каким-то образом отменяет более поздние вычисления на основе содержимого.

См. мое исправление здесь: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...