Ios 单击表单元格内的按钮,展开tableview并将scrollview内容大小适当增加

Ios 单击表单元格内的按钮,展开tableview并将scrollview内容大小适当增加,ios,swift,uitableview,uiscrollview,snapkit,Ios,Swift,Uitableview,Uiscrollview,Snapkit,我有一个UITableView,它被添加到UIScrollView中,作为视图控制器的一部分,该控制器附着在模型的一部分上,如下所示:- 正如您在模型中看到的,UITableView位于“特色业务”标签和包含绿色和粉色子视图的视图之间 此外,如果观察到,表视图中的每个单元格都有一个按钮,单击该按钮可切换包含详细信息列表的卡片视图。卡片视图的高度取决于详细信息的数量 我能够展开和收缩单元格以显示卡片视图,卡片视图是表格视图单元格的一部分,如模型中所示 问题在于扩展和收缩父表视图,以查看该表视图中

我有一个UITableView,它被添加到UIScrollView中,作为视图控制器的一部分,该控制器附着在模型的一部分上,如下所示:-

正如您在模型中看到的,UITableView位于“特色业务”标签和包含绿色和粉色子视图的视图之间

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

我能够展开和收缩单元格以显示卡片视图,卡片视图是表格视图单元格的一部分,如模型中所示

问题在于扩展和收缩父表视图,以查看该表视图中的所有单元格(表视图不应可滚动,任何单元格不应隐藏),并且只有滚动视图可滚动

以下是我的table view单元格代码,它涉及单元格的扩展以及更改表格的尺寸(高度)和滚动视图的内容大小:-

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()
}
父视图是具有滚动视图和表格视图的视图控制器

businessTable
是有问题的表的UITableView,而
scroll
是保存表视图的UIScrollView

我使用表视图单元格的标记跟踪
indexPath

下面的代码计算表视图单元格应展开的差值:-

    // 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
        }
    }
indexOfCellToExpand
是一个变量,用于跟踪已展开的表视图单元格

简言之,是否有任何方法可以展开和折叠表格视图,并适当更改滚动视图的内容大小,以获得所需的模型效果

任何帮助都将不胜感激

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

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()
    yourTableView.reloadData()
}

与计算高度和修改滚动视图的
.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)
    }

}
当您更改表视图(添加/删除行或节,或更改行高度)时,表视图的
intrinsicContentSize
将自动更新,其高度将像多行
UILabel
一样增大或减小


如果约束设置正确,自动布局将为您处理滚动视图的内容大小。

为什么您还要在另一个
滚动视图中添加
滚动视图
表格视图
)?@PGDev我需要显示的业务数量可能会有所不同。我需要一个表视图来处理这个问题。如果有更好的方法获得模拟中显示的UI,请共享它们。@PGDev这只是我刚才展示的模拟的一部分。在所示模型的上方和下方有更多视图
final class ContentSizedTableView: UITableView {

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

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

}