Ios 缩放时,更新UITableViewCell中的约束无法与UIWebView scrollView一起正常工作
我试图在放大后更新表格视图单元格的高度,以匹配Ios 缩放时,更新UITableViewCell中的约束无法与UIWebView scrollView一起正常工作,ios,swift,uitableview,uiwebview,constraints,Ios,Swift,Uitableview,Uiwebview,Constraints,我试图在放大后更新表格视图单元格的高度,以匹配UIWebView滚动视图的高度。UIWebView是表视图单元格的子视图 在 func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) { DispatchQueue.main.async { print("\nscrollViewDidEndZooming") pr
UIWebView
滚动视图的高度。UIWebView
是表视图单元格的子视图
在
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
DispatchQueue.main.async {
print("\nscrollViewDidEndZooming")
print("webView.scrollView.contentSize.height: \(self.webView.scrollView.contentSize.height)")
print("webViewHeightConstraint: \(self.webViewHeightConstraint.constant)")
let height = self.webView.scrollView.contentSize.height
self.webViewHeightConstraint.constant = height
myDelegate.reloadTableView()
}
}
在父控制器中:
func reloadTableView() {
tableView.beginUpdates()
tableView.endUpdates()
}
webview上加载了html内容。问题是,在调用didEndZooming
并更新高度约束后,它的设置不正确。高度约束的大小将一直增大到。在我看来,在tableView单元格中设置高度约束某种程度上创建了一个反馈循环
我怎样才能使它按我所期望的那样工作?(它应该调整到缩放值,而不会使scrollview的大小无限增长。)
更新:
在
单元格本身位于xib文件中。我现在将视图放在虚拟视图中(尝试查看这是否解决了我的问题(它没有)。web视图的上、下、左和右边缘都有约束。web视图也有高度约束。我正试图使用此高度约束来确定单元格的高度
这是放大和缩小几个周期后的日志输出。这是在设置新高度约束之前打印的:
ScrollViewDiEndZooming webView.scrollView.contentSize.height:962.0
webViewHeightConstraint:509.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:962.0
webViewHeightConstraint:962.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:1531.0
webViewHeightConstraint:962.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:1549.0
webViewHeightConstraint:1531.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:2566.0
webViewHeightConstraint:1549.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:2566.0
webViewHeightConstraint:2566.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:4779.0
webViewHeightConstraint:2566.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:4779.0
webViewHeightConstraint:4779.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:10989.0
webViewHeightConstraint:4779.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:10989.0
webViewHeightConstraint:10989.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:25110.0
webViewHeightConstraint:10989.0
ScrollViewDiEndZooming webView.scrollView.contentSize.height:25110.0
webViewHeightConstraint:25110.0
我觉得您所做的一切都是动态的,这就是问题所在,您最好添加一个全局高度数组,该数组最初包含表格单元格的默认高度,每次特定webview被僵尸化时,更改全局数组中与该单元格具有相同索引的相应值,并重新加载tableview,钩住tableViewCell出口高度 在cellForRowAt做这个
cell.heightConOfCell.constant = #coressponding value in global array#
在返回电池前,别忘了把它们放在线路上
cell.layoutSubviews()
cell.layoutIfNeeded()
return cell
从您的问题来看,您使用的是动态tableview单元格高度,我认为您为tableview单元格提供了固定的高度 返回高度为UITableViewAutomaticDimension
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
请尝试使用此选项:
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
self.webHeightConstraint.constant = self.webHeightConstraint.constant * scale
myDelegate?.reloadTableView()
}
这避免了必须引用webView滚动视图的contentSize,因为在缩小时,它不会低于webView大小
现在,它的工作并不完美,因为您看到webView放大到自身,然后在完成时捕捉到新的大小,但它始终是这样的,因为在缩放完成之前没有任何内容更新
另外,不要忘记适当地设置滚动视图的最小缩放和最大缩放级别。您应该在
表格视图(u:cellForRowAt:)中提供更多代码
方法,您的tableViewCell
外观以及webViewHeightConstraint
是什么。如果我们可以进行调试报告,则可以更轻松、更快地为您提供帮助。您应该发布更多信息来帮助我们,例如,在单元格中设置了哪些约束,您期望得到的内容的示例,等等。如果您需要t检查“反馈循环”,然后在ScrollViewDiEndZooming中进行一些日志记录,以查看它是否确实执行多次。我还建议检查它试图设置的实际高度。最后,UIWebView目前已被弃用,因此我建议查看WKWebView。谢谢,我选择UIWebView有几个原因。但我会我再看一看WKWebView。不,这不可能是那个问题,因为最初的问题表明UITableViewCell的大小确实发生了变化,而不是它所希望的那样。如果单元格的高度没有设置为UITableViewAutomaticDimension,那么它将不会发生任何变化。但是在日志输出中,如果它发生变化,webview的高度将更新这不是他返回的高度的问题,那么问题可能在于约束。您在这个全局数组中输入了什么值?您如何事先知道它们?最初的问题是用户缩放UIWebView,因此最终高度可能是任何东西。我是指每个单元格的初始高度值,它们将是默认值如果ues是静态的或使用动态的,则将设置为当前xib高度,每当发生缩放时,他将获取帧并将其设置为相应的索引单元格内部发生的所有事情。UIWebView是单元格的子视图。当UIWebView结束缩放时,应更新该特定单元格的高度(这是不起作用的)。因此,例如,如果UIWebView位于单元格3中并缩放,则单元格3应调整大小。调整大小所需的高度取自UIWebView,它与单元格的大小数组没有任何关系。单元格的新大小=单元格的旧大小+新大小
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
self.webHeightConstraint.constant = self.webHeightConstraint.constant * scale
myDelegate?.reloadTableView()
}