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(使用40HeightRequest
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设备上发生的。我刚刚用一个例子和一些屏幕截图更新了帖子。你能试试我更新的代码,看看它是否对你有用吗?