目标C:如何使导航栏与tableview滚动

我有一个UITableView和一个导航栏在我的应用程序的单个屏幕。 我想要导航栏与表格的其余部分一起滚动。

注意:我目前正在实现一个UITableView作为uiviewcontroller的子视图添加,而uiviewcontroller又是导航控制器的一部分

任何人都可以告诉我如何做到这一点?

在下面的答案我隐藏了真正的导航栏,并用一个假酒吧取代它。 如果您想使用真实的导航栏,代码仍然有效,只需在viewWillDisappear中恢复栏的原始位置即可。

隐藏导航控制器栏:

self.navigationController.navigationBar.hidden = YES; 

添加顶部栏作为当前控制器视图的子视图。

 UIView *headerView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bar.png"]]; [self.view addSubView:headerView]; 

在这一点上你有一个headerView和一个tableView下面。 保存原始帧:

 @property (nonatomic,assign) CGRect initialTableRect; @property (nonatomic,assign) CGRect initialHeaderRect; // This is how many pixels you are going to scroll up under the clock bar. // To scroll your whole headerView, set it to self.headerView.frame.height @property (nonatomic,assign) NSInteger kHiddenPixels; // viewDidLoad self.initialTableRect = self.tableView.frame; self.initialHeaderRect = self.headerView.frame; self.kHiddenPixels = self.headerView.frame.height; 

添加这个视图控制器,这也是你的表代表:

 #pragma mark UIScrollViewDelegateMethods - (void)scrollViewDidScroll:(UIScrollView *)aScrollView { // 0 at the initial position, negative down, positive up CGPoint offset = aScrollView.contentOffset; if (offset.y>=0 && offset.y<=kHiddenPixels) { // move header CGRect newRect = self.initialHeaderRect; newRect.origin.y -= offset.y; self.headerView.frame = newRect; // move and resize table newRect = self.initialTableRect; newRect.origin.y -= offset.y; newRect.size.height += offset.y; self.tableView.frame = newRect; } else if (self.headerView.frame.origin.y!=0 || self.headerView.frame.origin.y!=kHiddenPixels) { // outside the scrolling area but frame is not on 0 or kHiddenPixels, // which means we skipped scroll because drag was to fast if (offset.y<0){ // set initial position on header and table self.headerView.frame = self.initialHeaderRect; self.tableView.frame = self.initialTableRect; } else if (offset.y>kHiddenPixels) { // set scrolled up position on header CGRect rect = self.initialHeaderRect; rect.origin.y = -1*kHiddenPixels; self.headerView.frame = rect; // set scrolled up position on table rect = self.initialTableRect; rect.size.height += kHiddenPixels; rect.origin.y -= kHiddenPixels; self.tableView.frame = rect; } } } 

这将检查表格高度,并在表格视图滚动时移动顶部条。 由于tableView正在移动的顶部栏以前填充,我也扩大了表视图的大小。

编辑:刚刚上传了一个顶部的80像素和kHiddenPixels = 35:

在这里输入图像说明

一个可能的增强:现在,作为tableView的第一行在顶部栏下滚动,顶部栏在时间栏下滚动。 如果tableView和顶部栏一起滚动,直到顶部栏消失,然后让第一行开始在顶部栏下滚动,看起来会更自然。 不知道如何做到这一点,也许有一个平移手势识别器和禁用表滚动,直到该栏被隐藏。

如果导航栏是表视图的一部分,或者是较大的滚动视图(除了表视图的子视图)的子视图,导航栏可以与表视图的其他单元格滚动的唯一方法。 看看这个问题: 我怎样才能让我的网页滚动导航栏? 。 做一个更大的滚动视图,并添加表视图和导航栏到这个滚动视图。 如果你想让导航栏成为表格视图的一部分,你需要为它定制一个自定义单元格,这会招致更多的麻烦!