SWIFT - ScrollView 内的 WKWebView 中的 HTML 滚动事件
Posted
技术标签:
【中文标题】SWIFT - ScrollView 内的 WKWebView 中的 HTML 滚动事件【英文标题】:SWIFT - HTML scrolling events in a WKWebView that's inside a ScrollView 【发布时间】:2016-02-02 14:07:39 【问题描述】:我有一个用于测试目的的网页 (https://storage.googleapis.com/htmltestingbucket/nested_scroll_helper.html),它只打印 html 在固定标题中捕获的滚动事件的计数器
当 WKWebView 是片段中唯一可滚动的元素时,一切正常,WebView 将滚动事件发送到页面
如果我想在 WebView 上方和下方添加原生元素,那么事情会变得更加复杂。
UIScrollView
UILabel
WKWebView
UILabel
我知道在 ScrollView 中包含 WebView 并不好,但我必须在 html 文档中提供混合内容和正确滚动事件的单一滚动体验。我发现了很多关于这个问题的问题,但我无法创建一个完整的端到端解决方案。
【问题讨论】:
【参考方案1】:更新: 好吧,我花了一段时间才明白你想要做什么。
我知道你想保留外部 scrollView,但我很确定它不可能实现你想要做的(唯一的方法可能是你设置 outerScrollView.delegate = webView
- 但对我不起作用当我尝试时)
我认为最好的解决方案是:
-
移除你的外层滚动视图
将 webView 的 contentInsets 设置为所需的顶部和底部高度。例如。 100pt :
webView.contentInset = UIEdgeInsetsMake(100,0,100,0);
将您的 UIElements 作为 subView 添加到您的 UIWebView 而不是 UIScrollView(基本上是添加到您使用 contentInsets 创建的可用空间中)
以前(其他方式):
-
设置 UIWebView 的高度限制
将高度约束作为 IBOutlet 存储在 UIViewController 中
在您的
viewDidLoad
或情节提要中设置webView.scrollView.scrollEnabled = NO;
webView 加载后,立即提取其内容高度webView.scrollView.contentSize.height
用它的值更新 UIWebView 高度约束s content height via
self.webViewContentHeightConstraint.constant = webView.scrollView.contentSize.height
调用[self.scrollView layoutIfNeeded];确保您的视图再次呈现
当 webView 完成加载内容时不要忘记执行第 4 步和第 5 步
【讨论】:
但是 webview 是如何感知滚动的呢? 它不会因为你不会在 webview 中滚动了。您将只有一个可滚动的视图,即“移动”webview。从而获得完美的单卷体验 我明白了,但这与我们正在寻找的相反。我需要 webview 在滚动时知道滚动 所以你想让 uiwebview 知道你在父 scrollView 中滚动?如果是,我可以调整我的答案。否则,请给我更多的上下文 是的。请调整你的答案【参考方案2】:你基本上在滚动视图中有一个滚动视图。你认为这将如何运作?我会将标签添加到 WebView 中的 HTML。看不出他们需要本地化的任何理由。
或者,您可以尝试将标签添加到 UIWebView 的 UIScrollView。这是它的第一个子视图。不确定是否需要调整滚动视图插图。注入 html 可能会更可靠。
【讨论】:
以上是关于SWIFT - ScrollView 内的 WKWebView 中的 HTML 滚动事件的主要内容,如果未能解决你的问题,请参考以下文章
Swift/Xcode - 无法与 ScrollView 中的 View 内的文本框和按钮进行交互
使用swift在scrollview内的stackview中更改uibutton中的标题
Swift - UIScrollView 内的 UICollectionView - 自动布局