当UITableView开始滚动

时间:2018-03-07 15:44:12

标签: ios swift uiscrollview autolayout

我有一个视图控制器,它的视图包含一个标题视图和一个UITableView。 我不想把标题视图放在表视图中来管理滚动,我希望它保持独立于表视图。 但是,当我向下滚动表视图时,我想隐藏它,我当前的解决方案如下所示:

func scrollViewDidScroll(scrollView: UIScrollView) -> Void {
      //if contentOffset.y <= 0, table view is at the top, animate view in
      //else animate view out once
}

然而,由于我正在更改layoutConstraint的常量以移出视图,因此它会中断滚动并在单元格中弹出,因为它突然有更多空间可供显示。

我考虑过在两个视图下面使用滚动视图移出标题视图并将触摸传递给表视图。但是,使用自动布局内容滚动视图会让人感到痛苦......

关于这个或任何想法,我能做什么?当您滚动内容时,基本上就像Safari中的导航栏滚动一样。

谢谢

2 个答案:

答案 0 :(得分:0)

为什么您希望视图独立于tableview?这正是tableview所擅长的。将视图放在tableview中作为常规视图,向其中添加控件,然后将此视图和tableview与IBOutlet链接到视图控制器。

然后将此视图设置为tableview的tableHeaderView并获得所需效果,标题视图将位于tableview内容的最顶部,并将随之滚动:

override func viewDidLoad() {
    super.viewDidLoad()
    headerView.layoutIfNeeded()
    headerView.frame.size = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
    tableView.tableHeaderView = headerView
}

想要更新标题视图的内容后,只需更改其内容并再次设置tableHeaderView:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // Let's say myLabel is a label inside the headerView
    myLabel.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus accumsan eros nec sem sagittis, vitae facilisis urna mattis."
    // Update the headerView size
    myLabel.preferredMaxLayoutWidth = myLabel.frame.width
    myLabel.layoutIfNeeded()
    headerView.layoutIfNeeded()
    headerView.frame.size = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
    tableView.tableHeaderView = headerView
}

您还可以将视图放入其自己的Xib文件中,并将其设置为tableHeaderView:

let views = UINib(nibName: "HeaderView", bundle: Bundle.main).instantiate(withOwner: self, options: nil)
if views.count > 0, let headerView = views.first as? UIView {
    tableView.tableHeaderView = headerView
}

滚动视图委托的替代方案

在tableview上方放置一个视图,并将其顶部约束连接到代码(示例中为headerTopConstraint),然后执行以下操作:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    headerTopConstraint.constant += -scrollView.contentOffset.y
    if headerTopConstraint.constant > 0 {
        headerTopConstraint.constant = 0
        return
    }
    if -headerTopConstraint.constant > headerView.bounds.height {
        let diff = headerTopConstraint.constant + headerView.bounds.height
        headerTopConstraint.constant = -headerView.bounds.height
        scrollView.contentOffset = CGPoint(x: 0, y: -diff)
    }
    else {
        scrollView.contentOffset = CGPoint(x: 0, y: 0)
    }
}

标题视图将与tableview一起向上滚动。滚动应该仍然感觉顺畅。

答案 1 :(得分:0)

当您显示表格视图从UITableView的所有单元格的中心反弹时,这种美丽:

  override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
    UIView.animate(withDuration: 0.4) {
        cell.transform = CGAffineTransform.identity
    }
}