iOS中的WebView以桌面模式打开

问题描述

我使用Xamarin WebView打开一个站点,该站点正在使用响应式设计。

在Android上,该网站会填满页面,并且可以正常运行Android Picture

“我的IOS问题”出现在桌面上,而不是在移动模式IOS Picture中,

经过更多搜索后,我发现WKWebView不像UIWebView那样使用ScaletoFitPage 我尝试此代码,但未更改任何内容 WKWebView didn't equivalent for UIWebView's scalesPageToFit

有人可以帮我解决我从一周到现在一直没有找到解决方案的问题。

[assembly: ExportRenderer(typeof(CustomWebView),typeof(CustomWebVieWrenderer))]
namespace TanfezClient.iOS.Renderers
{
class CustomWebVieWrenderer : WkWebVieWrenderer
{
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
//this.ScalesLargeContentimage = true;
//this.ShowsLargeContentViewer = true;
//this.SizetoFit();

        string jScript = @"var Meta = document.createElement('Meta'); Meta.setAttribute('name','viewport'); 
       Meta.setAttribute('content','width=device-width'); document.getElementsByTagName('head')[0].appendChild(Meta);";
        WKUserScript wkUScript = new WKUserScript((Nsstring)jScript,WKUserScriptInjectionTime.AtDocumentEnd,true);
        WKUserContentController wkUController = new WKUserContentController();
        wkUController.AddUserScript(wkUScript);
        WKWebViewConfiguration wkWebConfig = new WKWebViewConfiguration();
        wkWebConfig.UserContentController = wkUController;
        WKWebView webView = new WKWebView(Frame,wkWebConfig);
    }
}

解决方法

您可以尝试在构造函数方法中编写代码以检查其是否可以工作。

例如:

public class HybridWebViewRenderer : WkWebViewRenderer,IWKScriptMessageHandler
{
    const string JavaScriptFunction = "var meta = document.createElement('meta'); meta.setAttribute('name','viewport'); meta.setAttribute('content','width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
    WKUserContentController userController;
  
    public HybridWebViewRenderer() : this(new WKWebViewConfiguration())
    {

    }

    public HybridWebViewRenderer(WKWebViewConfiguration config) : base(config)
    {
        userController = config.UserContentController;
        var script = new WKUserScript(new NSString(JavaScriptFunction),WKUserScriptInjectionTime.AtDocumentEnd,true);
        userController.AddUserScript(script);
        userController.AddScriptMessageHandler(this,"invokeAction");
    }

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.OldElement != null)
        {
            userController.RemoveAllUserScripts();
            userController.RemoveScriptMessageHandler("invokeAction");
            HybridWebView hybridWebView = e.OldElement as HybridWebView;
            hybridWebView.Cleanup();

        }

        if (e.NewElement != null)
        {
            string filename = Path.Combine(NSBundle.MainBundle.BundlePath,$"Content/{((HybridWebView)Element).Uri}");
            LoadRequest(new NSUrlRequest(new NSUrl(filename,false)));
        }
     
    }

    public void DidReceiveScriptMessage(WKUserContentController userContentController,WKScriptMessage message)
    {
        ((HybridWebView)Element).InvokeAction(message.Body.ToString());
    }

}
,
class CustomWebViewRenderer : WkWebViewRenderer
{
    const string JavaScriptFunction = @"var meta = document.createElement('meta'); meta.setAttribute('name','width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
    WKUserContentController userController;

    public CustomWebViewRenderer() : this(new WKWebViewConfiguration())
    {
    }

    public CustomWebViewRenderer(WKWebViewConfiguration config) : base(config)
    {

        userController = config.UserContentController;
        var script = new WKUserScript(new NSString(JavaScriptFunction),false);
        userController.AddUserScript(script);
        config.UserContentController = userController;
        WKWebView webView = new WKWebView(Frame,config);
    }

}

最后我找到了解决方案,非常感谢@Junior Jiang-MSFT感谢我帮助我用以前编写的代码重试了您的想法,并很好地工作了。