如何使用Xamarin.Forms修复iOS的WebView自定义渲染器的旋转?

时间:2016-08-29 18:24:00

标签: webview xamarin.ios rotation xamarin.forms custom-renderer

我在Xamarin.Forms项目中为WebView创建了一个自定义渲染器。 WebView在Android上运行良好。不幸的是,在iOS上,当设备旋转时,网页(任何网页)都无法正确调整到WebView的新维度。如果我使用内置的WebView for Forms,则页面会在旋转时正确调整大小。

我的自定义渲染器出了什么问题?

以下是我的自定义渲染器的精简版本(问题仍然存在):

using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using UIKit;
using Foundation;

[assembly: ExportRenderer(typeof(WebView), typeof(MyProject.iOS.WebViewRenderer))]
namespace MyProject.iOS {
    public class WebViewRenderer : ViewRenderer<WebView, UIWebView> {
        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) {
            if (Control == null) {
                var webView = new UIWebView(Frame);
                webView.AutoresizingMask = UIViewAutoresizing.All;
                SetNativeControl(webView);
                webView.LoadRequest(new NSUrlRequest(new NSUrl("http://cnn.com")));
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

要解决此问题,请将以下内容添加到自定义渲染器:

    public async static Task<IEnumerable<RootObjectUtrechtCity>> GetUtrechtCity()
    {
        var http = new HttpClient();
        var response = await http.GetAsync("https://stallingsnet.nl/api/1/parkingcount/utrecht");
        var result = await response.Content.ReadAsStringAsync();
        var data = JsonConvert.DeserializeObject<List<RootObjectUtrechtCity>>(result);
        return data;
    }

答案 1 :(得分:0)

要修复旋转问题,您需要在创建UIWebView时使用NativeView.Bounds。

[assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]
namespaceMobile.App.iOS
{
    public class CustomWebViewRenderer : ViewRenderer<CustomWebView, UIWebView>
    {      
        protected override void OnElementChanged(ElementChangedEventArgs<CustomWebView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                var webView = new UIWebView(NativeView.Bounds);

                webView.ShouldStartLoad += HandleShouldStartLoad;
                webView.AutoresizingMask = UIViewAutoresizing.All;
                webView.ScalesPageToFit = true;                
                SetNativeControl(webView);

                webView.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
            }
        }

        public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint)
        {
            return new SizeRequest(Size.Zero, Size.Zero);
        }
    }
}