问题描述
我使用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感谢我帮助我用以前编写的代码重试了您的想法,并很好地工作了。