Xamarin Forms中WebView的自适应高度
- 时间:
- 浏览:0
- 来源:极速快3_快3软件_极速快3软件
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 = 60
;
webview.HeightRequest = 60
;
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 (60
); // 这里的时间都能能调整
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(60
);// 这里的时间都能能调整
_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