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

时间:2017-04-04 16:17:29

标签: ios swift uitableview uiscrollview

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

4 个答案:

答案 0 :(得分:4)

首先确保您的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添加到subview的{​​{1}}中:

tableView

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

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)

滚动时调整func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 100 } 的框架:

UIView

演示:

enter image description here

答案 1 :(得分: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;
    }
}

希望它有所帮助...

答案 2 :(得分:0)

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

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

来源:UITableView with fixed section headers

答案 3 :(得分:0)

我在

上遇到了同样的问题
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()中的

问题消失了! :)

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

祝你好运!