【问题标题】:Decreasing the topAnchor of an UIView by scrolling the tableView inside it通过滚动其中的 tableView 来减少 UIView 的 topAnchor
【发布时间】:2022-12-10 01:54:49
【问题描述】:

我认为此视图中有 tableView。这个视图在 UIViewController 的底部,还有另一个视图在它的顶部。但是我将 tableView View 的顶部锚点设置到屏幕的顶部,我可以在需要时更改它 - 请参见屏幕截图

我想当 tableView 滚动时,顶部锚点减少。 为此,我在包含TableViewUIView 中做到了这一点

  func scrollViewDidScroll(_ scrollView: UIScrollView) {
 
    let offset = scrollView.contentOffset.y
    scrollView.bounces = false
    eventHandler?(.scrollViewDidScroll(offset: offset))
}

有了这个eventHandler,我将偏移量发送给父级UIViewController 然后使用这个函数来减少topAnchor

private func handleOffsetScrolling(offset: CGFloat) {
    let constant =  taskViewHeight - offset
    if constant > 0 {
        todosTableTopAnchor.constant = taskViewHeight - offset
        view.layoutIfNeeded()
    }
}

taskViewHeight是顶部第二个视图的高度。它按预期运行良好,但在减少 topAnchor 期间,tableView 也在滚动,我想防止这种情况发生。我的意思是 tableView 不应该滚动,直到视图到达顶部然后滚动。 当再次滚动到 tableView 的顶部时,它应该增加顶部锚点并将 tableView 视图移动到其原始位置。 我只想防止 tableView 在增加和减少顶部锚点期间滚动。

有什么办法吗? 谢谢

【问题讨论】:

  • 你想要高度对绿色的看法要改变——要“挤”吗?或者你想让它向上滑出视线吗?
  • 向上滑动视图,绿色的会在蓝色的下面
  • 你在故事板中布置这个吗?还是通过代码?

标签: ios swift uitableview


【解决方案1】:

您几乎肯定不想将这些视图放在滚动视图中。

要让(蓝色)表格视图“向上滑动”绿色视图,您可以将两个视图的顶部约束到相同的 Y 位置。然后设置table view的contentInset.top为绿色view的高度,开始table view的.contentOffset.y绿色视图的高度。

这是一个非常简单的例子:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    let greenHeaderView = UIView()
    let tableView = UITableView()
    
    // let's make the green view height: 100-points
    let greenHeight: CGFloat = 100.0
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // let's add a label to the green view so we can see what goes on
        let label = UILabel()
        label.textAlignment = .center
        label.text = "This is sample text for the Header View"
        label.textColor = .yellow
        
        greenHeaderView.backgroundColor = .systemGreen

        label.translatesAutoresizingMaskIntoConstraints = false
        greenHeaderView.addSubview(label)

        greenHeaderView.translatesAutoresizingMaskIntoConstraints = false
        tableView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(greenHeaderView)
        view.addSubview(tableView)
        
        let g = view.safeAreaLayoutGuide
        NSLayoutConstraint.activate([
            
            greenHeaderView.topAnchor.constraint(equalTo: g.topAnchor),
            greenHeaderView.leadingAnchor.constraint(equalTo: g.leadingAnchor),
            greenHeaderView.trailingAnchor.constraint(equalTo: g.trailingAnchor),

            greenHeaderView.heightAnchor.constraint(equalToConstant: greenHeight),
            
            label.centerXAnchor.constraint(equalTo: greenHeaderView.centerXAnchor),
            label.centerYAnchor.constraint(equalTo: greenHeaderView.centerYAnchor),
            
            tableView.topAnchor.constraint(equalTo: g.topAnchor),
            tableView.leadingAnchor.constraint(equalTo: g.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: g.trailingAnchor),
            tableView.bottomAnchor.constraint(equalTo: g.bottomAnchor),
            
        ])
        
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "c")
        tableView.dataSource = self
        tableView.delegate = self
    
        tableView.backgroundColor = .clear

        tableView.contentInset.top = greenHeight
        tableView.contentOffset.y = -greenHeight

    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let c = tableView.dequeueReusableCell(withIdentifier: "c", for: indexPath)
        c.textLabel?.text = "(indexPath)"
        return c
    }
    
}

它看起来像这样:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多