【问题标题】:programmatically change WKWebView content size以编程方式更改 WKWebView 内容大小
【发布时间】:2017-02-28 07:03:31
【问题描述】:

我在 PhoneGap / Cordova 4.0+ 应用程序(通过cordova-plugin-wkwebview-engine)和used programmatic AutoLayout constraints 中添加了一个 WKWebView 子视图,以使 WKWebView 的大小与 MainViewController 的视图相同。

当我查看 WKWebView 的边界时,它与 MainViewController 视图的边界匹配。

但是使用Javascript to inspect the content size,特别是看起来像这样的脚本:

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 很有趣!),我实际上注意到问题发生在我传递到 PhoneGap/Cordova 中的 WKWebView 的 任何 URL 上。这是 apple.com 在我的应用程序中的样子:

这是它应该在 Mobile Safari 中(在模拟器中运行)中的正确尺寸版本:

您可以看到顶部栏项目的间距不同(在桌面上它们应该从窗口的任一侧缩进一些)并且底部边缘显示更多,因为 Web 视图的内部高度更高。

为了解决我的问题,我已经完成了所有工作,从将 WKWebView 实例从 viewDidLoad 移出到 viewDidAppear,并尝试“硬编码”将静态 iPad Pro 大小的帧大小传递到 [WKWebView initWithFrame:],但是内容大小保持在 735.0。在模拟器的移动版 Safari 和桌面版 Safari 中,相同的内容呈现精美(且正确)。

如何强制 WKWebView 的内容大小匹配父视图的边界?

如果您想在 iPad Pro 模拟器上查看此错误,我在 https://github.com/dautermann/phonegap-air 有一个公共 github 存储库。请务必获取"demonstrate-issue" 分支。

【问题讨论】:

  • 当我尝试时,我可以看到 apple.com 在我的WKWebView 中有 4 列。您在哪里/以哪种方法检查contentSize
  • 您是在 Cordova 应用程序中执行此操作吗?至于我在哪里运行该 javascript,它目前位于 MainViewController 的 viewDidAppear: 方法中。我在viewWillAppearviewDidLoad 得到了相同的结果。
  • @MichaelDautermann 你有没有使用状态栏插件?
  • 我不知道。我没有明确安装一个。我如何确定一个是意外安装还是作为其他东西的一部分?
  • @MichaelDautermann 如果已安装,您将在项目的插件文件夹中找到它。

标签: cordova phonegap-plugins wkwebview wkwebviewconfiguration cordova-4


【解决方案1】:

我认为您遇到的问题与 WebView 没有直接关系。这与以下事实有关:出于向后兼容性的原因,在 iPad Pro 上运行的“旧”应用程序没有获得“原始分辨率”,而是使用 iPad 1024x768。

让 Apple 相信您了解 iPad Pro 及其原始分辨率的方法是指定一些 LaunchScreen 故事板。是的,这有点令人惊讶,但这就是它的本质(参见例如https://forums.developer.apple.com/thread/17193)。如果我在 GitHub 上的测试项目中修改 OTAApplication 目标并将标准 CDVLaunchScreen 指定为 Launch Screen File 一切对我来说都很好。

更新

根据Force iPad Pro to full resolution without Launch Screen,如果您使用 XCode 8,只需为 iPad Pro 指定适当分辨率的启动图像就足够了。不过没试过。

【讨论】:

  • 做到了!不管 Cordova/Phonegap(它不依赖于它)如何,这不是我以前遇到过的问题,这真是太奇怪了。
【解决方案2】:

简答:

您需要在您的WKNavigationDelegatewebView:didFinishNavigation: 方法中检查contentSize,直到这里您只能使用您的JavaScript 代码获得735.0 作为contentSize

稍微长一点的回答

当您创建WKWebView 时,它的frameinitwithFrameframe 中具有相同的大小。它不会改变,直到自动布局发挥其魔力,即直到您的 UIViewController 中的 viewDidLayoutSubviews 方法。

此时,您有一个覆盖主视图的WKWebView,但您网站的contentSize 不是您所期望的。因为你的网站还没有。

您需要设置webView.navigationDelegate = {delegate} 来监听导航事件。在通过 webView:didFinishNavigation: 方法调用 delegate 之前,您的网站不存在 %100。从现在开始,您可以测量预期的contentSize 值。

希望对您有所帮助。

【讨论】:

  • 我会尝试一下。我可以告诉你的是,我通过WKWebView initWithFrame: 发送的帧的size.height 为1024.0,但即使在多个loadRequest: 之后出现的高度为735.0。那是来自我传递给 WKWebView 的 Javascript 查询。 WKWebView 的边界和框架 CGRect 属性的大小实际上是正确的(即比 735.0 高得多)。
  • gist.github.com/buranmert/204decdb5c5f0f06a77129de9d45936e 这是我尝试过的代码(使用我得到的值)。奇怪的是我无法在我的示例项目中重现 2-column-apple.com,这只是一个简单的 WKWebView
  • 认为您没有复制此内容的原因是因为您似乎正在使用 WKWebView,只是将其放入非 Cordova/非Phonegap 应用程序中。我的 WKWebview 实例化发生在一个名为 CDVWKWebViewEngine.m 的文件中,该文件是 cordova-plugin-wkwebview-engine 的一部分。
  • 您可以尝试将观察者添加到CDVPageDidLoadNotification 通知并在contentSize 被触发后测量它吗? github.com/apache/cordova-plugin-wkwebview-engine/blob/master/…
  • 感谢您在这方面的坚持。当CDVPageDidLoadNotification 触发时,我现在得到的 contentSize 为 1453(!)。比735.0好多了。不幸的是,我在 apple.com WKWebView 中仍然只看到两列。如果你想确切地看到我所看到的,我现在已经推送了demonstration github repo
猜你喜欢
  • 2013-09-06
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多