防止UITableView滚动直到Y偏移达到值

问题描述

我有一个UIViewController,其中包含2个子视图。标题视图和一个UITableView

我想基于表格视图滚动的偏移量Y来缩小标题视图。

我已经可以使用以下方法实现这一目标

import UIKit

class ViewController: UIViewController {

  private let profileHeader: UIView =  {
    let view = UIView(frame: .zero)
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .systemteal
    view.heightAnchor.constraint(equalToConstant: 300).isActive = true
    return view
  }()

  private let tableView: UITableView = {
    let view = UITableView(frame: .zero)
    view.translatesAutoresizingMaskIntoConstraints = false
    view.showsverticalScrollIndicator = true
    view.register(UITableViewCell.self,forCellReuseIdentifier: "CELL")
    return view
  }()

  private lazy var profileHeaderTopAnchor = NSLayoutConstraint()

  override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self

    tableView.backgroundColor = .systemGray

    [profileHeader,tableView].forEach(view.addSubview(_:))
    NSLayoutConstraint.activate([
      profileHeader.leadingAnchor.constraint(equalTo: view.leadingAnchor),profileHeader.trailingAnchor.constraint(equalTo: view.trailingAnchor),tableView.topAnchor.constraint(equalTo: profileHeader.bottomAnchor),tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),])

    profileHeaderTopAnchor = profileHeader.topAnchor.constraint(equalTo: view.topAnchor)
    profileHeaderTopAnchor.isActive = true
  }
}

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

  func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CELL",for: indexPath)
    cell.textLabel?.text = "Cell #\(indexPath.row)"
    return cell
  }
}

extension ViewController: UITableViewDelegate {
  func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let yAxisValue = scrollView.contentOffset.y
    let headerHeightConstant = min(140,yAxisValue)
    profileHeaderTopAnchor.constant = -headerHeightConstant
  }
}

但是,这会导致某种视差效果,因为表格视图在页眉折叠时继续滚动。

parallax effect in current attempt

* edit-我无法嵌入图片,请查看链接图片

相反,我想复制Twitter iOS应用程序配置文件页面的行为。

标题停止折叠之前,第一个单元格不应该滚动到屏幕之外,该折叠操作由scrollViewDidScroll方法处理。

此外,在第一个单元格再次出现之前,页眉不应开始扩展。

顺序为:

向上滚动 标题折叠然后表格滚动

向下滚动 表格滚动,然后标题展开

这可能吗?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)