Xamarin表单WKWebView大小不小于';收缩

Xamarin表单WKWebView大小不小于';收缩,xamarin,xamarin.forms,xamarin.ios,wkwebview,custom-renderer,Xamarin,Xamarin.forms,Xamarin.ios,Wkwebview,Custom Renderer,我有一个自定义的WkWebView,其中我将视图的高度设置为html内容的大小 当我初始化它时,这非常有效,但是当我将WkWebView的源代码更改为较短的html时,问题就出现了 我已经在我的应用程序的android版本中遇到了这个问题,我通过在EvaluateJavaScriptAsync之前将HeightRequest设置为0来解决这个问题。这样的话,视野就会越来越大 我用iOS做了同样的尝试,但它保持了我拥有的最高内容 例如: 如果我将WkWebView的源代码设置为200px高的htm

我有一个自定义的
WkWebView
,其中我将视图的
高度设置为html内容的大小

当我初始化它时,这非常有效,但是当我将
WkWebView
源代码更改为较短的html时,问题就出现了

我已经在我的应用程序的android版本中遇到了这个问题,我通过在
EvaluateJavaScriptAsync
之前将HeightRequest设置为0来解决这个问题。这样的话,视野就会越来越大

我用iOS做了同样的尝试,但它保持了我拥有的最高内容

例如:

如果我将
WkWebView
的源代码设置为200px高的html文件,并将其更改为1000px高的html文件,它工作正常,我可以看到所有内容。但是,如果我尝试返回到我的200px html文件,我会在下面得到一个800px的空白空间,并保持1000px的高度

目标是始终保持
WKWebView
的高度以适应其内容的高度

以下是自定义渲染的当前版本

namespace MyNamespace.iOS.CustomControl
{
公共类AutoHeightWebViewRenderer:WkWebViewRenderer
{
受保护的覆盖无效OnElementChanged(VisualElementChangedEventArgs e)
{
尝试
{
基础。一个要素发生变化(e);
如果(NativeView!=null)
{
var webView=(WKWebView)NativeView;
NavigationDelegate=新的ExtendedWKWebViewDelegate(此);
}
}
捕获(例外情况除外)
{
//记录异常
}   
}
}
类扩展的WKWebViewDelegate:WKNavigationDelegate
{
自动高度webViewRenderer webViewRenderer;
公共扩展的WKWebViewDelegate(AutoHeightWebViewRenderer\u webViewRenderer=null)
{
webViewRenderer=_webViewRenderer??新的自动高度webViewRenderer();
}
公共覆盖异步void DidFinishNavigation(WKWebView、WKNavigation)
{
尝试
{
var_webView=webViewRenderer.Element作为AutoHeightWebView;
如果(_webView!=null)
{
_webView.HeightRequest=0d;
等待任务。延迟(300);
var result=await_webView.EvaluateJavaScriptAsync(((function(){return document.body.scrollHeight;})();
_webView.HeightRequest=Convert.ToDouble(结果);
}
}
捕获(例外情况除外)
{
//记录异常
}
}
}
}
编辑1: 更清楚地说,我可以更改webview的高度,但我不知道高度,因为它总是返回迄今为止显示的最大html的高度。无论我使用
\u webView.EvaluateJavaScriptAsync(((function(){return document.body.scrollHeight;})())
还是
webView.ScrollView.ContentSize.Height

编辑2: 这里有一个小例子来帮助理解这个问题。我有两个按钮和我的自定义webview(使用40
HeightRequest
empty html初始化)。 第一个按钮将webview的
源代码设置为70px长的HTML。第二个将
源代码设置为280px长的HTML

在本例中,我单击第一个按钮而不是第二个按钮,最后再次单击第一个按钮。您可以看到,在前两次单击中,webview变得越来越大。但是,当我选择返回第一个html(从280px传递到70px)时,webview应该会缩小,但它保持了280px的长度

第一个按钮(70像素长)

第二个按钮(280像素长)

回到第一个按钮(应该是70px而不是280px)。


模拟器和iOS设备都出现了问题。

您可以更改
webView的
框架
,以更改
高度

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 
    }
}

我也有同样的问题,CustomNavigationDelegate也只会显示相同的大尺寸,即设备显示尺寸

我发现我在XAML和代码隐藏的init部分设置了这一点,它以某种方式覆盖了后来基于内容的计算


在这里查看我的修复:

嗨,杰克!谢谢你的回复。我试过你的解决办法,但问题还是一样。
(双精度)webView.ScrollView.ContentSize.Height始终给出最高值。如果使用
EvaluateJavaScriptAsync
,我会得到相同的结果。我可以使用
HeightRequest
更改视图的高度。问题是我不知道html有多长(它的高度是多少)。返回的高度值是自webview创建以来在webview中显示的最大html的高度。简而言之,我需要一种方法来获取当前html的当前高度,而不是目前显示的最大高度。谢谢您是否在此处添加了断点以查看webView.ScrollView.ContentSize.Height的值?对于长或短html内容,我的值确实发生了变化。我刚刚用两个按钮在一个单独的视图中测试了我的自定义webview。1将webview的源代码更改为html 200px长,另一个按钮将源代码更改为html 100px长。大小始终为200px长。
webView.ScrollView.ContentSize.Height始终返回使用的最大html。这是在一个真正的iPhone设备上发生的。我刚刚用一个例子和一些屏幕截图更新了帖子。你能试试我更新的代码,看看它是否对你有用吗?