我正在开发一个带有弹性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()
}
}