如何以编程方式滚动时更新UITableview标头高度

时间:2019-08-05 17:49:46

标签: swift uitableview animation uitableviewsectionheader ios11.4

在我的应用程序中,我有顶部导航栏,并且在导航栏下方有一个表格视图。我有两行的CollectionViewCell,这些行以编程方式添加到UITableViewHeader中。每当我将TableView滚动到顶部时,我都希望标题停在导航栏的正下方,并更新TableView Header的高度,以便仅显示一行。我只想做一个动画(如收缩),当TableViewHeader粘贴到导航栏时,两个collectionview行应通过减小Header Height而变成一行。如何以编程方式完成

下面是我显示CustomHeaderView的代码

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView.init(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 183))
    let headerCell = tableView.dequeueReusableCell(withIdentifier: kLastPlayedidentifier) as! LastPlayedTVC
    headerCell.frame = headerView.frame
    headerCell.category = lastPlayedData
    headerView.addSubview(headerCell)
    return headerView
}

我也在检查滚动位置,以编程方式设置tableview标头的高度,这对我来说并不成功。

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
    print(scrollView.contentOffset)
    if scrollView.contentOffset.y > 237 //This value is to check when the header reached the top position {
//Condition to check and animate the headerview height to make collectionview cell two rows into one rows.
    }

滚动时标题停留在顶部时,如何实现TableViewHeader高度更新。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您要查找的是“粘性标头” 并且您还想更改标题。

  • 粘性部分是自动内置的,我认为如果您仅使用UITableViewController(style:.plain),如果对您不起作用,则可以使用谷歌粘性标题,并且有很多答案。 p>

  • 有关更改高度或为其设置动画的部分。您做对了,只需执行以下操作:

    ///更新您的viewForHeader方法,以解决上面的headerRows变量

//更新您的viewForHeader方法以解决上述headerHeadws变量

// default 2, you modify this in your scroll
var headerRows = 2

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
let height = headerRows == 2 ? 183 : 91
        let headerView = UIView.init(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: height))
        let headerCell = tableView.dequeueReusableCell(withIdentifier: kLastPlayedidentifier) as! LastPlayedTVC
        headerCell.frame = headerView.frame
        headerCell.category = lastPlayedData
        headerView.addSubview(headerCell)
        return headerView
    }

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print(scrollView.contentOffset)
        if scrollView.contentOffset.y > 237 {
            updatedHeader.frame.size.height = 40
            self.tableviewObj.tableHeaderView = updatedHeader
            headerRows = 1 } else {
            headerRows = 2
        }
        self.tableView.reloadSectionHeaders()
    }

如果您想做一些动画,您需要做的是将对headerView的引用存储在视图控制器的变量中,并在scrollViewDidScroll内部使用UIView.animate {...}对其进行动画处理。

希望这对人有帮助。