Xamarin Forms中WebView的自适应高度
- 时间:
- 浏览:1
Xamarin Forms中WebView的自适应强度
2018-03-20 12:08 JoesWeek 阅读(...) 评论() 编辑 收藏在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 = 3000;
webview.HeightRequest = 3000;
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 (3000); // 这里的时间可不也能调整
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(3000);// 这里的时间可不也能调整
_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截图:
- 分类 Xamarin.Forms