在tableView中添加和更新带有弹性标题的粘性后,其滚动变得不稳定

时间:2017-12-28 07:22:51

标签: uitableview uiscrollview header swift4 sticky

我正在开发一个带有弹性headerView的自定义tableView,它还具有粘性headerView。

我已成功通过更新其contentInset和contentOffset属性来实现它。但在更新其contentInset后,滚动变得不稳定。

以下是相同的代码: 我在viewController的viewDidLoad方法中添加了以下代码,并调用另一个方法updateHeaderView来更新headerView Height和y位置。 kTableHeaderHeight是常量tableView标题高度。

    headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: kTableHeaderHeight))
    headerView = tableView.tableHeaderView
    tableView.tableHeaderView = nil
    tableView.addSubview(headerView)

    tableView.contentInset = UIEdgeInsets(top: kTableHeaderHeight, left: 0, bottom: 0, right: 0)
    tableView.contentOffset = CGPoint(x: 0, y: -kTableHeaderHeight)

updateHeaderView方法中,我添加了代码:

var headerRect = CGRect(x: 0, y: -kTableHeaderHeight, width: tableView.bounds.width, height: kTableHeaderHeight)
    var insetTop: CGFloat = 0
    if tableView.contentOffset.y < -kTableHeaderHeight {
        headerRect.origin.y = tableView.contentOffset.y
        headerRect.size.height = -tableView.contentOffset.y
        insetTop = kTableHeaderHeight
    }else if tableView.contentOffset.y >= 0 {
        insetTop = 0
    }else if tableView.contentOffset.y <= 0{
        insetTop = -tableView.contentOffset.y
    }
    tableView.contentInset = UIEdgeInsets(top: insetTop, left: 0, bottom: 0, right: 0)
    tableView.scrollIndicatorInsets = UIEdgeInsets(top: insetTop, left: 0, bottom: 0, right: 0)
    headerView.frame = headerRect

并从scrollView的委托方法scrollviewDidScroll调用上述方法。

完成所有这些操作之后,粘滞且有弹性的tableView行为与预期的一样,但tableView滚动变得不稳定。仅供参考,我不想使用任何第三方库。

用于班级的其他方法

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }

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

        if (indexPath.row % 2) == 0 {
            cell.backgroundColor = UIColor.gray
        }else {
            cell.backgroundColor = UIColor.white
        }

        return cell
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderViewCell") as! HeaderViewCell

        return headerCell
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 53.0
    }
}

extension ViewController: UIScrollViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        self.updateHeaderView()
    }
}

0 个答案:

没有答案