- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我的 iOS 应用程序中,我想显示几个包含一些 HTML 的项目。为此,我构建了一个包含 UITableView 的 NewsListViewController。对于那个 UITableView(导出:newsListTableView),我创建了一个名为 NewsTableViewCell 的自定义 UITableViewCell,它将通过代表们。 NewsTableViewCell 包含一个将显示我的 HTML 的 WKWebKit 控件。这是我的代码:
NewsListViewController.swift
import UIKit
class NewsListViewController: UIViewController {
@IBOutlet weak var newsListTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.newsListTableView.delegate = self
self.newsListTableView.dataSource = self
self.newsListTableView.register(UINib(nibName: "NewsTableViewCell", bundle: nil), forCellReuseIdentifier: "cell")
}
}
extension NewsListViewController: UITableViewDelegate {
}
extension NewsListViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return 300.0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NewsTableViewCell
cell.titleText = "My Title"
cell.dateTimeText = "01.01.1998"
cell.contentHtml = "<html><head><meta name=\"viewport\" content=\"initial-scale=1.0\" /><style>html, body { margin: 0; padding: 0; font-size: 15px; }</style></head><body><b>Hello News</b><br />Hello News<br />Hello News<br />Hello News</body></html>"
return cell
}
}
NewsTableViewCell.xib
我的 WKWebKit(导出:newsContentPreviewWebView)位于 UIView(导出:newsContentViewContainer)内与 UIView 一起成长的适当约束。我的 UIView 也带有适当的约束,可以随着整个单元格的增长而增长。
NewsTableViewCell.swift
import UIKit
import WebKit
@IBDesignable class NewsTableViewCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var dateTimeLabel: UILabel!
@IBOutlet weak var newsContentViewContainer: UIView!
@IBOutlet weak var newsContentPreviewWebView: WKWebView!
@IBInspectable var titleText: String? {
get {
return self.titleLabel.text
}
set(value) {
self.titleLabel.text = value
}
}
@IBInspectable var dateTimeText: String? {
get {
return self.dateTimeLabel.text
}
set(value) {
self.dateTimeLabel.text = value
}
}
@IBInspectable var contentHtml: String? {
get {
return nil
}
set(value) {
self.newsContentPreviewWebView.loadHTMLString(value ?? "", baseURL: nil)
}
}
override func awakeFromNib() {
super.awakeFromNib()
self.newsContentPreviewWebView.navigationDelegate = self
}
}
extension NewsTableViewCell: WKNavigationDelegate {
}
这是结果:
现在,我希望单元格尽可能小,但仍显示完整的 WKWebKit 内容。
当我删除...
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return 300.0
}
...从 NewsListViewController.swift 单元格高度将只考虑 WKWebKit 控件上方的标签:
我认为这是发生了,因为当应用调整单元格大小时我的 WKWebKit 的内容没有加载。
我试图通过听取 WKWebKit 的 >> 完成导航 << 在我的 NewsTableViewCell.swift 中调用委托(delegate)并调整父 View 的大小来解决这个问题,像这样的整个单元格高度:
extension NewsTableViewCell: WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
if complete != nil {
webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
let h: CGFloat = height as! CGFloat
let newsContentFrame: CGRect = self.newsContentViewContainer.frame
self.newsContentViewContainer.frame = CGRect(x: newsContentFrame.minX, y: newsContentFrame.minY, width: newsContentFrame.width, height: h)
let tableCellFrame: CGRect = self.frame
self.frame = CGRect(x: tableCellFrame.minX, y: tableCellFrame.minY, width: tableCellFrame.width, height: tableCellFrame.height + h)
})
}
})
}
}
这是结果:
单元格重叠,这表明我试图以错误的方式解决这个问题。
自动调整自定义表格单元格大小以适应其所有内容(包括 WKWebKit 的内容)的正确方法是什么?
最佳答案
问题是你永远不会给你的单元格一个高度。手动设置框架
self.frame = CGRect(x: tableCellFrame.minX, y: tableCellFrame.minY, width: tableCellFrame.width, height: tableCellFrame.height + h)
不好。您应该始终使用专用委托(delegate)方法或估计行高技术 ( Using Auto Layout in UITableView for dynamic cell layouts & variable row heights )。
问题很棘手:您需要等待 webview 加载才能计算其高度。但是在加载 webview 的内容之前调用 heightForCell
时需要它的高度。
我看到 5 种解决方案:
completionHandler
被调用时,您调用一个委托(delegate)(例如您的 View Controller ),它将重新加载相应的单元格并为其提供刚刚计算的正确高度。这个解决方案很简单,但在每次加载之前,你需要在你的单元格中给出一个错误的高度。因此,您可以在单元格中定义一个加载状态,但是当单元格即将出现时,您总会遇到一些小故障。Operation
,等待单元格的 html 加载和评估给定的 javascript。完成所有操作后,重新加载 tableview关于ios - 如何使用底层 WKWebKit 自动调整 UITableViewCell 的大小,使其尊重 Web View 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48463531/
我正在使用 Xcode 8.3.3 和 Swift 3 为使用 Cocoa 的 iMac 开发一个应用程序。我的目标是使用 VCgoToWebPage 并向用户显示网页。我的程序多次调用这个函数,但我
我符合“WKNavigationDelegate”并根据我正在使用的文档这些方法,但似乎他们没有接到电话。我没有得到任何结果。 func webView(_ webView: WKWebView, d
原生应用由 WkWebview 和蓝色原生导航栏组成。 在装有 iOS 10.3.1 和 Safari 10 的 iPad 上运行 弹跳已启用。 WkWebview 显示一个 position:fix
在 UIWebView 中,将 UIDataDetectorTypes 添加到 View 相当容易: myUIWebView.dataDetectorTypes = UIDataDetectorTyp
在发布这篇文章之前,我在互联网上查找如何在 iOS Swift WKWebKit 中实现 cocoa pod MBCircularProgressBarView 来跟踪加载网站的进度。我尝试过结合其他
WebKit 在没有任何调试信息的情况下在 iOS 11 上崩溃 - 下面是我能做的最好的。 Thread 1: EXC_BAD_ACCESS (code=1, address=0x10) 是否有可能
WebKit 1 公开了 WebFrameView,我可以在其中调用打印操作。 - (void)webView:(WebView *)sender printFrameView:(WebFrameVi
目标 实现一个 Safari 应用程序扩展,显示一个弹出窗口,里面有一个显示网页的 WebView。 问题 弹出窗口在 Safari 中正确显示,单击它会显示一个空白的弹出窗口,其中没有任何内容。 根
音频播放完毕后,我试图从ObjC传递到JavaScript的通知。 我目前叫Obj C像这样播放音频(来自JS): window.webkit.messageHandlers.playLetter.p
当我第一次运行应用程序并且网页正在加载时,加载指示器按预期显示。 然后它会在页面加载时按预期消失。 然后我导航到一个新网页,但指示器没有再次出现 有什么建议吗? import UIKit import
我按照这个例子在 swift 中检索 DOM 元素:https://www.hackingwithswift.com/example-code/wkwebview/how-to-run-javascr
我做错了什么......? 在 iOS 上,我想拍摄完整网页的快照。在 iOS 11 之前,如果不处理一大堆逻辑来滚动 WKWebView 的 scrollView 等,这是不可能的。 以下错误已报告
我想要加载请求的网页并访问 DOM 的元素以从其中一个节点返回值。我有一些 JavaScript 可以做到这一点。问题是将值返回到我的应用程序的最佳方法。 我看到 UIWebView 有一个功能 st
我想从 UIWebView 切换到 WKWebView。在我的代码中,Web View 实例是在屏幕外创建的(没有附加到 View 层次结构)并加载了 URL。加载完成后,Web View 将在单独的
我无法加载我的 subview 。我将它们定义为弱 WKWebKit socket 。如果我执行 view = tickerView 或 view = graphView,它可以工作,但它只加载其中之
我正在试验 WkWebKit 在应用程序和页面之间来回对话。我可以使用 WkWebView evaluateJavascript 方法让 javaScript 正常执行,但是当我尝试在 JavaScr
我正在尝试使用 iOS 应用程序(swift)中的字符串参数调用 JS 中的函数。我期望数据结构如下: [{"name":"Mat. Category","value":"PIPE"}, {"name
尝试使用 WKWebView 使用首选评估 Javascript swift 函数获取 html 元素名称或值。我一直收到零。我想也许我的函数在页面加载之前就触发了,因此永远找不到元素。现在只是试图通
我正在 iOS 10.x Simulator 上的 UIWebView 中加载网页,效果很好。 现在我正在尝试像这样在 WKWebView 中加载相同的网页 - @interface ViewCont
在我的 iOS 应用程序中,我想显示几个包含一些 HTML 的项目。为此,我构建了一个包含 UITableView 的 NewsListViewController。对于那个 UITableView(
我是一名优秀的程序员,十分优秀!