Cordova 以编程方式更改WKWebView内容大小
我将WKWebView子视图添加到PhoneGap/Cordova 4.0+应用程序(via)中,并使WKWebView的大小与MainViewController的视图相同 查看WKWebView的边界时,它与MainViewController视图的边界相匹配 但使用的脚本,具体如下所示:Cordova 以编程方式更改WKWebView内容大小,cordova,phonegap-plugins,wkwebview,wkwebviewconfiguration,cordova-4,Cordova,Phonegap Plugins,Wkwebview,Wkwebviewconfiguration,Cordova 4,我将WKWebView子视图添加到PhoneGap/Cordova 4.0+应用程序(via)中,并使WKWebView的大小与MainViewController的视图相同 查看WKWebView的边界时,它与MainViewController视图的边界相匹配 但使用的脚本,具体如下所示: var body = document.body; var html = document.documentElement; Math.max(body.scrollHeight,body.offset
var body = document.body;
var html = document.documentElement;
Math.max(body.scrollHeight,body.offsetHeight,html.clientHeight,html.offsetHeight);
这返回的高度实际上约为WKWebView边界高度的1/2到2/3(在iPad Pro模拟器上,我将边界高度设置为1024.0,但Javascript报告的内容高度仅为735.0)。我只显示了我想显示的未调整大小的Vue.js内容的一半
由于我无法显示我正在使用的实际内容(NDA fun!),我实际上注意到,我在PhoneGap/Cordova中传递到WKWebView的任何URL都会出现问题。以下是apple.com在我的应用程序中的外观:
以下是在MobileSafari(在模拟器中运行)中它应该是什么样子,大小正确的版本:
您可以看到顶部栏项目的间距不同(在桌面上,它们应该从窗口的两侧缩进),并且在底部边缘显示更多,因为web视图的内部高度更高
为了解决我的问题,我已经做了所有的事情,从将WKWebView实例化从viewDidLoad
移出到ViewDidAspect
,还尝试“硬编码”一个静态iPad Pro大小的框架大小被传递到[WKWebView initWithFrame:
,但内容大小仍然保持在735.0。同样的内容在模拟器的移动Safari和桌面Safari中都呈现得非常漂亮(正确)
如何强制WKWebView的内容大小与父视图的边界匹配
如果你想在iPadPro模拟器上看到这个bug,我有一个公共github repo。一定要去拿树枝。简短回答:
您需要在WKNavigationDelegate
的webView:didFinishNavigation:
方法中检查contentSize
,直到这里,您的JavaScript代码只能获得735.0 ascontentSize
再回答一点
创建WKWebView
时,其框架在initwithFrame
的框架中具有相同的大小。直到autolayout发挥其魔力,也就是说,直到您的UIViewController
中的viewDidLayoutSubviews
方法,它才会改变
此时,您有一个WKWebView
,它涵盖了主视图,但您网站的contentSize
并不是您所期望的。因为你的网站还没有
您需要设置webView.navigationDelegate={delegate}
以侦听导航事件。在通过webView:didfishnavigation:
方法调用delegate
之前,您的网站不会在那里%100。从现在起,您可以测量预期的contentSize
值
希望能有所帮助。我认为您遇到的问题与WebView没有直接关系。这与以下事实有关:出于向后兼容性的原因,在iPad Pro上运行的“旧”应用程序没有“本机分辨率”,而是使用iPad 1024x768
让苹果相信你知道iPad Pro及其本机分辨率的方法是指定一些LaunchScreen情节提要。是的,这是一个有点令人惊讶的方式,但这就是它(参见示例)。如果我在GitHub上修改您的测试项目中的OTA应用程序
目标,并将标准CDVlunchScreen
指定为LaunchScreen文件
,那么一切对我来说都很好
更新
如果使用XCode 8,只需为iPad Pro指定合适分辨率的启动图像就足够了。不过我还没有试过。当我试过的时候,我可以在我的WKWebView
中看到apple.com的4列。您在何处/以何种方法检查contentSize
?您是否在Cordova应用程序中执行此操作?至于我在哪里运行javascript,它目前位于MainViewController的viewdide:
方法中。我在@MichaelDautermann的viewwillbeen
和viewDidLoad
中得到了相同的结果。你是否在使用状态栏插件?我不知道。我没有明确安装一个。我如何确定一个是偶然安装的,还是作为其他东西的一部分安装的?@MichaelDautermann如果安装了它,您将在项目的插件文件夹中找到它。我将在几分钟后尝试一下。我可以告诉你的是,我通过WKWebView initWithFrame:
发送的帧的大小和高度为1024.0,但即使在多次loadRequest:
之后,也会显示735.0的高度。这是我传递到WKWebView的Javascript查询的结果。WKWebView的边界和帧CGRect属性实际上大小正确(即比735.0高得多)。下面是我尝试过的代码(使用我得到的值)。奇怪的是,我无法在我的示例项目中复制2列apple.com,它只是一个简单的WKWebView。我想你之所以不复制它,是因为你似乎在使用一个WKWebView,它只是被放到了一个非Cordova/非Phonegap的应用程序中。我的WKWebview实例化发生在名为CDVWKWebViewEngine.m
的文件中,该文件是cordova插件WKWebview引擎
的一部分。您能否尝试将观察者添加到CDVPageDidLoadNotification
通知中,并在触发后测量contentSize
?谢谢你在这件事上支持我。当CDVPageDidLoadNotification
触发时,我现在得到的contentSize为1453(!)。比735.0好多了。不幸的是,我在apple.com的WKWebView中只看到了两个专栏。如果你想确切地看到我所看到的,我现在按下了一个按钮。成功了!不管Cordova/Phonegap(它不依赖于Cordova/Phonegap),这不是我以前遇到的问题,这是多么奇怪。