如何在 UITableView 顶部添加一个一起滚动的视图,但在滚动后粘在顶部

Posted

技术标签:

【中文标题】如何在 UITableView 顶部添加一个一起滚动的视图,但在滚动后粘在顶部【英文标题】:How to add a view on top of UITableView that scrolls together, but stick to top after scrolling 【发布时间】:2017-04-04 16:17:29 【问题描述】:

我的 UITableView 顶部有一个高度为 100 像素的 UIView。当我向上滚动时,我希望 UIView 与我的 UITableView 一起滚动,就好像它是它的一部分一样。当我的 UIView 的 50 像素被隐藏而无法向上滚动时,我想在继续向上滚动的同时将 UIView 固定在顶部。如何做到这一点?我尝试使用将 UIView 的顶部 NSLayoutConstraint 常量更改为等于我的 tableview 的内容偏移量,但它们不会以相同的速度滚动。

【问题讨论】:

你应该看看这个答案:***.com/a/17583567/6203030你要找的是tableView的样式 【参考方案1】:

首先确保你的 tableView 是grouped:

self.tableView = UITableView(frame: CGRect(x: 0, y: (self.navigationController?.navigationBar.frame.maxY)!, width: self.view.bounds.size.width, height: (self.view.bounds.size.height - (self.navigationController?.navigationBar.frame.maxY)!)), style: .grouped)
self.tableView.delegate = self
self.tableView.dataSource = self
self.view.addSubview(self.tableView)  

然后您需要将UIView 添加到您的tableViewsubview 中:

self.myView = UIView()
self.myView.backgroundColor = UIColor.green
self.myView.frame = CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: 100)
self.tableView.addSubview(self.myView)

为您的 tableView 的第一部分添加一个高度为 100 的标题,以便您的单元格位于正确的位置:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 100

然后在滚动时调整UIView的框架:

func scrollViewDidScroll(_ scrollView: UIScrollView) 
    let offset = scrollView.contentOffset.y
    if(offset > 50)
        self.myView.frame = CGRect(x: 0, y: offset - 50, width: self.view.bounds.size.width, height: 100)
    else
        self.myView.frame = CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: 100)
    

演示:

【讨论】:

这是一种绝妙的方法,也是我找到的最佳答案。这应该是公认的答案。【参考方案2】:

如果我正确理解您的问题,您可以通过像这样实现表视图scrollViewDidScroll: 方法来做到这一点

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    static CGFloat previousOffset;
    CGRect rect = self.yourUIView.frame;

   //NSLog you'r UIView position before putting any condition 
   // NSLog(@"Origin %f",rect.origin.y);

    rect.origin.y += previousOffset - scrollView.contentOffset.y;
    previousOffset = scrollView.contentOffset.y;

    //assuming you'r UIView y position starts from 0
    //Before setting the condition please make sure to run without any 
    //condition if not working

    if(rect.origin.y>=-50 && rect.origin.y<=0)
            self.yourUIView.frame = rect;
    

希望对你有帮助...

【讨论】:

【参考方案3】:

你需要为你的 tableView 实现 viewForHeader inSection 方法(记得让你的 ViewController 实现 tableviewDelegate 协议),一旦你得到它,你应该将你的 tableViewStyle 设置为 UITableViewStylePlain

如果您对更多帮助感兴趣,请分享您的代码。

来源:UITableView with fixed section headers

【讨论】:

【参考方案4】:

我遇到了同样的问题

navigationItem.largeTitleDisplayMode = .always
navigationBar.prefersLargeTitles = true

tableView.contentInset = UIEdgeInsets(top: 40, left: 0, bottom: 0, right: 0)

对我来说,上述任何选项都无济于事,但我意识到你可以打电话

tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: false)

viewDidload() 中,问题消失了! :)

完全忘记了这种方法,并为这种令人毛骨悚然的行为花费了太多时间。

祝你好运!

【讨论】:

以上是关于如何在 UITableView 顶部添加一个一起滚动的视图,但在滚动后粘在顶部的主要内容,如果未能解决你的问题,请参考以下文章

如何在UICollectionView中添加HeaderView,如UITableView的tableHeaderView

如何在 UITableView 弹跳区域下方编辑或添加 UIView(顶部)?像 Twitter 的 - 更新等

如何与 UITableView 一起滚动标题?

使用核心数据时在 UITableView 顶部添加新行

UITableView 滚动到单元格顶部

UITableView 阴影顶部和底部