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()
}