在缩放时,使用UIWebView scrollView更新UITableViewCell中的约束无法正常工作

时间:2017-12-23 19:58:03

标签: ios swift uitableview uiwebview constraints

我正在尝试更新表格视图单元格的高度以匹配放大后UIWebView滚动视图的高度。UIWebView是表格视图单元格的子视图。

on

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的大小无限大。)

更新: 在

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: WebViewCell.description(), for: indexPath) as! WebViewCell

    //The cell delegate implements the didFinishLoad() function
    cell.delegate = self

    //TODO: I know this is not efficient, will update later.
    if let html = viewModel.emailInfo?.htmlContent {
        cell.loadHTMLString(html)
    }

    return cell
}

单元格本身位于xib文件中。我现在将视图置于虚拟视图中(试图看看这是否解决了我的问题(它没有).Web视图在顶部,底部,左侧和右侧边缘都有约束.webview视图也有高度约束。正是这个高度约束webViewHeightConstraint,我试图用它来确定单元格的高度。

enter image description here

这是几个放大和缩小周期后的日志输出。在设置新的高度约束之前打印:

  

scrollViewDidEndZooming webView.scrollView.contentSize.height:962.0   webViewHeightConstraint:509.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:962.0   webViewHeightConstraint:962.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:1531.0   webViewHeightConstraint:962.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:1549.0   webViewHeightConstraint:1531.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:2566.0   webViewHeightConstraint:1549.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:2566.0   webViewHeightConstraint:2566.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:4779.0   webViewHeightConstraint:2566.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:4779.0   webViewHeightConstraint:4779.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:10989.0   webViewHeightConstraint:4779.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:10989.0   webViewHeightConstraint:10989.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:25110.0   webViewHeightConstraint:10989.0

     

scrollViewDidEndZooming webView.scrollView.contentSize.height:25110.0   webViewHeightConstraint:25110.0

3 个答案:

答案 0 :(得分:1)

请尝试使用此代码:

func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
    self.webHeightConstraint.constant = self.webHeightConstraint.constant * scale

    myDelegate?.reloadTableView()
}

这样可以避免引用webViews滚动视图的contentSize,因为在缩小时它不会低于webView大小。

现在它不能完美地工作,因为你看到webView放大了自己,然后它在你完成时捕捉到新的大小,但它总是会像那样,因为在缩放之前没有任何更新完了。

另外,不要忘记适当地设置滚动视图的minimumZoom和maximumZoom级别。

答案 1 :(得分:0)

我觉得你所做的一切都是动态的,这就是问题所在,你最好添加一个全局高度数组,最初包含表格单元格的默认高度,每次特定的webview被修改为相应的值在与该单元格具有相同索引的全局数组中并重新加载tableview,将tableViewCell高度挂钩为IBOutlet

并在cellForRowAt

中执行此操作
 cell.heightConOfCell.constant = #coressponding value in global array#
不要忘记在返回单元格之前将它们放到行中

 cell.layoutSubviews()

 cell.layoutIfNeeded()

 return cell

我希望你的问题是你正在使用动态tableViewCell高度

答案 2 :(得分:0)

我认为你为tableview单元提供了一个固定的高度。

将高度返回为UITableViewAutomaticDimension

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}