Xamarin Forms中WebView的自适应高度
程序员文章站
2022-04-24 19:28:40
在Xamarin.Forms中,WebView如果嵌套在StackLayout和RelativeLayout中必须要设置HeightRequest和WidthRequest属性才会进行渲染。可是在实际项目中往往WebView内容是不固定的,就造成了设置了HeightRequest和WidthRequ ......
在Xamarin.Forms中,WebView如果嵌套在StackLayout和RelativeLayout中必须要设置HeightRequest和WidthRequest属性才会进行渲染。可是在实际项目中往往WebView内容是不固定的,就造成了设置了HeightRequest和WidthRequest后显示效果不理想,不是高了就是短了,很影响用户体验,那么就必须要自适应网页的高度才行。
首先在共享库中的添加XamWebView类:
public class XamWebView: WebView {}
然后使用它:
var webview= new XamWebView(); webview.HorizontalOptions = LayoutOptions.Fill; webview.VerticalOptions = LayoutOptions.StartAndExpand; //给个默认的高度和宽度 webview.WidthRequest = 300; webview.HeightRequest = 300; webview.Source = "https://www.cnblogs.com/";
然后在IOS中,你需要使用自定义的委托:
[assembly: ExportRenderer (typeof(XamWebView), typeof(XamWebViewRenderer))] namespace Core.iOS { public class XamWebViewRenderer : WebViewRenderer { protected override void OnElementChanged (VisualElementChangedEventArgs e) { base.OnElementChanged (e); Delegate = new XamUIWebViewDelegate (this); } } }
然后用异步和小延迟重写LoadFinished以获取整个ContentSize.Height(如果内容较大,即使加载完成后也需要一些时间才能呈现)
public class XamUIWebViewDelegate : UIWebViewDelegate { XamWebViewRenderer webViewRenderer; public XamUIWebViewDelegate (XamWebViewRenderer _webViewRenderer = null) { webViewRenderer = _webViewRenderer ?? new XamWebViewRenderer (); } public override async void LoadingFinished (UIWebView webView) { var wv = webViewRenderer.Element as XamWebView; if (wv != null) { await System.Threading.Tasks.Task.Delay (100); // 这里的时间可以调整 wv.HeightRequest = (double)webView.ScrollView.ContentSize.Height; } } }
在Android中,您需要使用自定义的Android.Webkit.WebViewClient:
using WebView = Android.Webkit.WebView; [assembly: ExportRenderer (typeof(XamWebView), typeof(XamWebViewRenderer))] namespace Core.Droid { public class XamWebViewRenderer : WebViewRenderer { static XamWebView _xwebView = null; WebView _webView; public XamWebViewRenderer(Context context) : base(context) { } class XamWebViewClient : Android.Webkit.WebViewClient { public override async void OnPageFinished(WebView view, string url) { if (_xwebView != null) { int i = 10; while (view.ContentHeight == 0 && i-- > 0) await System.Threading.Tasks.Task.Delay(100);// 这里的时间可以调整 _xwebView.HeightRequest = view.ContentHeight; } } } protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e) { base.OnElementChanged(e); _xwebView = e.NewElement as XamWebView; _webView = Control; if (e.OldElement == null) { _webView.SetWebViewClient(new XamWebViewClient()); } } } }
放一张Android截图:
上一篇: html input 使用(代码实例)
下一篇: python实现TF-IDF算法解析
推荐阅读
-
Android中WebView图片实现自适应的方法
-
ie和firefox中通用的设置div最小高度和达到这一最小高度后自适应的css代码
-
IOS中label的自适应高度(四种方法)
-
HTML/CSS中,DIV高度自适应的解决方法
-
EasyUI中的combobox下拉框如何自适应高度?
-
Vue中textarea自适应高度方案的实现
-
如何让HTML页面中的背景图片自适应浏览器高度和宽度(电脑高度和宽度)
-
Equal Height Columns --DIV+CSS布局中自适应高度的解决方法_html/css_WEB-ITnose
-
Android中WebView图片实现自适应的方法
-
css中div高度自适应的方法(兼容FF IE)_html/css_WEB-ITnose