ios - 在单击表格单元格内的按钮时,通过适当的差异扩展表格 View 并增加 ScrollView 内容大小

标签 ios swift uitableview uiscrollview snapkit

我有一个 UITableView,它已作为 View Controller 的一部分添加到 UIScrollView 中,该 View Controller 遵循下面所示模型的一部分:-

Part of the mockup

正如您在模型中看到的那样,UITableView 位于“特色企业”标签和包含绿色和粉红色 subview 的 View 之间

此外,如果观察到,表格 View 中的每个单元格都有一个按钮,单击该按钮可切换包含详细信息列表的卡片 View 。卡片 View 的高度取决于细节的数量。

我能够扩展和收缩单元格以显示卡片 View ,它是模型中所示的表格 View 单元格的一部分。

问题在于扩展和收缩父 TableView ,以便看到该 TableView 中的所有单元格( TableView 不应该是可滚动的,并且不应隐藏任何单元格) 并且只有 ScrollView 是可滚动的。

这是我的表格 View 单元格的代码,它涉及单元格的扩展以及更改表格的尺寸(高度)和 ScrollView 的内容大小:-

func toggleBusinessesTable() {
    var businessTableHeight = self.parent!.businessTable.frame.height
    if self.parent!.indexOfCellToExpand > -1 {
        self.parent!.businessTable.snp.remakeConstraints { (make) in
            make.top.equalTo(self.parent!.featuredBusinessesHeading.snp.bottom).offset(3.5)
            make.left.equalTo(self.parent!.scroll.snp.left)
            make.width.equalTo(self.parent!.view.bounds.width)
            make.height.equalTo(CGFloat(businessTableHeight) + CGFloat(self.tableHeight))
        }
        self.parent!.scroll.layoutIfNeeded()
        self.parent!.scroll.contentSize.height = self.parent!.usersCollectionView.frame.maxY + 75
    }
    else if self.parent!.indexOfCellToExpand == -1 {
        self.parent!.businessTable.snp.remakeConstraints { (make) in
            make.top.equalTo(self.parent!.featuredBusinessesHeading.snp.bottom).offset(3.5)
            make.left.equalTo(self.parent!.scroll.snp.left)
            make.width.equalTo(self.parent!.view.bounds.width)
            make.height.equalTo(CGFloat(businessTableHeight) - CGFloat(self.tableHeight))
        }
        self.parent!.scroll.layoutIfNeeded()
        self.parent!.scroll.contentSize.height = self.parent!.usersCollectionView.frame.maxY + 75
    }
}

func expandCell(_ sender: UI.Button) {
    if self.parent!.indexOfCellToExpand != self.tag {
        print("EXPANDING...")
        self.parent!.indexOfCellToExpand = self.tag
        self.parent!.businessTable.reloadRows(at: [IndexPath(row: self.tag, section: 0)], with: .fade)
        self.parent!.businessTable.scrollToRow(at: IndexPath(row: self.tag, section: 0), at: .top, animated: true)
    }
    else if self.parent!.indexOfCellToExpand == self.tag {
        print("CONTRACTING...")
        self.parent!.indexOfCellToExpand = -1
        self.parent!.businessTable.reloadRows(at: [IndexPath(row: self.tag, section: 0)], with: .fade)
        self.parent!.businessTable.scrollToRow(at: IndexPath(row: self.tag, section: 0), at: .top, animated: true)
    }
    //        self.toggleBusinessesTable()
}

parent 是具有 ScrollView 和表格 View 的 View Controller

businessTable 是 UITableView 是有问题的表,scroll 是包含 TableView 的 UIScrollView

我正在使用表格 View 单元格的标签来跟踪 indexPath

下面的代码计算表格 View 单元格应该扩展的差异:-

    // tableHeight is initially 0 at the beginning
    if self.business_service_charges.count <= 4 {
        for each in self.business_service_charges {
            self.tableHeight += 80 + each.sub_service_charges.count*80
        }
    } else if self.business_service_charges.count > 4 {
        for each in self.business_service_charges[0...3] {
            self.tableHeight += 80 + each.sub_service_charges.count*80
        }
    }

表格 View 单元格的 tableHeight 变量用于计算表格 View 应该扩展/收缩多少。

但是在执行 self.toggleBusinessesTable() 时,表格 View 扩展得比它应该扩展的要多,在底部 View 和表格 View 之间添加了多余的间距,并且在收缩时,表格 View 变得更小隐藏了其他单元格,使表格 View 可滚动。

尺寸的 UITableView 例程:-

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.row == indexOfCellToExpand {
        var tableHeight = 0
        if self.featuredBusinesses[indexPath.row].businessServiceCharges.count <= 4 {
            for each in self.featuredBusinesses[indexPath.row].businessServiceCharges {
                tableHeight += 80 + each.sub_service_charges.count*80
            }
        } else if self.featuredBusinesses[indexPath.row].businessServiceCharges.count > 4 {
            for each in self.featuredBusinesses[indexPath.row].businessServiceCharges[0...3] {
                tableHeight += 80 + each.sub_service_charges.count*80
            }
        }
        return CGFloat(250 + tableHeight)
    }
    return 250
}

indexOfCellToExpand 是一个变量,用于跟踪已展开的表格 View 单元格

简而言之,有什么方法可以展开和折叠表格 View 并适当更改 ScrollView 的内容大小以获得模型所需的效果?

如有任何帮助,我们将不胜感激。

此外,我还使用snapkit 来设置单元格的布局

最佳答案

无需计算高度和修改 ScrollView 的 .contentSize,您可以使用自动布局和子类 UITableView 来确定自己的高度:

final class ContentSizedTableView: UITableView {

    override var contentSize:CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }

}

当您更改表格 View 时 - 添加/删除行或部分,或更改行高 - 表格 View 的 intrinsicContentSize 将自动更新,并且其高度将像多行 UILabel.

正确设置约束后,自动布局将为您处理 ScrollView 的内容大小。

关于ios - 在单击表格单元格内的按钮时,通过适当的差异扩展表格 View 并增加 ScrollView 内容大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56701263/

相关文章:

ios - 存储对象的潜在泄漏

ios - 在 Swift 中为 Bonjour NetService 创建 TXT 记录

iphone - 使用 ASIHTTPRequest 的 UITableViewCell 中的 UIImageView 性能

ios - 为 TableView 部分添加背景 iOS

objective-c - 带有自定义阴影图像的 UIButton

ios - 来自多对多关系的核心数据详细信息 View

ios - IF LET 与 GUARD LET 中的返回语句

ios - NSStream.close() 是同步的 TCP 吗?

ios - 我如何继续旋转图像,直到服务器快速响应

ios - 更改静态表中单元格图像的图像大小