【问题标题】:UITableVIew header without bouncing when pull down下拉时 UITableVIew 标头没有弹跳
【发布时间】:2013-05-16 14:24:42
【问题描述】:

我有一个UITableView,我可以很容易地添加一个标题视图。许多应用程序(如 Facebook,用于查看事件)都有一个 headerView,当您下拉时,标题视图保持不变,但表格的其余部分(UITableViewCell's)正在弹跳。向上滚动时,标题消失。我怎样才能实现这个功能?

现在当我拉下 UITableView 时,甚至 headerView 也会弹跳

【问题讨论】:

  • 当您说“反弹”时,您的意思是向上/向下滚动到标题之外吗?
  • 基本上当我向下滚动时,标题保持不变。当我向上滚动时,标题消失了。这是tableHeaderView
  • OK - 我查看了 Facebook 应用程序的事件表视图。看起来它具有默认行为。您的表格视图中有多少部分和这些部分中有多少行?也许你没有足够的东西来获得你想要的效果?
  • 所以你想让表格的单个标题视图表现得像节标题对吧?

标签: objective-c uitableview


【解决方案1】:

您可以通过向标题视图添加子视图并在表格视图滚动超出顶部时调整其frametransform 来轻松实现此效果,即其contentOffsety 组件变为否定的。

示例(在UITableViewController 子类中):

- (void)viewDidLoad
{
    [super viewDidLoad];
    CGFloat headerHeight = 64.0f;
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, headerHeight)];
    UIView *headerContentView = [[UIView alloc] initWithFrame:headerView.bounds];
    headerContentView.backgroundColor = [UIColor greenColor];
    headerContentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [headerView addSubview:headerContentView];
    self.tableView.tableHeaderView = headerView;
}

//Note: UITableView is a subclass of UIScrollView, so we
//      can use UIScrollViewDelegate methods.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat offsetY = scrollView.contentOffset.y;
    UIView *headerContentView = self.tableView.tableHeaderView.subviews[0];
    headerContentView.transform = CGAffineTransformMakeTranslation(0, MIN(offsetY, 0));
}

(为了简单起见,我刚刚使用了scrollViewDidScroll: 中实际标题视图的第一个子视图,您可能希望使用一个属性来代替。)

【讨论】:

  • 这个解决方案的真正亮点是在 tableHeaderView 中使用子视图。我尝试在没有子视图的情况下这样做,结果很奇怪,所以子视图是关键。
  • 你的解决方案是最好的:D
  • 如果您想将 tableview 标题卡在顶部,然后应用此修改后的代码.. - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat offsetY = scrollView.contentOffset.y; UIView *headerContentView = self.tableView.tableHeaderView.subviews[0]; if(offsetY >0){ headerContentView.transform = CGAffineTransformMakeTranslation(0, offsetY); } else{ headerContentView.transform = CGAffineTransformMakeTranslation(0, MIN(offsetY, 0)); } }
  • 太棒了。您可以使用@g212gs 的更改来确保标题不会移动。
  • 请注意,如果标题视图中有一个按钮,虽然它始终可见,但随着表格向上滚动,它会逐渐无响应(从按钮的底部到顶部),直到一旦表格向上滚动到标题的高度或更多,它就完全没有响应,即滚动会影响按钮的触摸。因此,如果标题中有按钮,这不是解决方案。
【解决方案2】:

您的UITableView 很可能工作正常。默认情况下,节标题在普通样式表中是粘性的。这意味着当您向下滚动标题时,标题将停留在 UITableView 框架的顶部,直到下一个部分标题将其推开。向上滚动时会发生相反的情况。相反,您会在 UITableView 框架底部的部分页脚上获得粘性行为。

EDIT误解了原来的问题:

我建议使用节标题而不是表格视图标题来获得您正在寻找的粘性行为。

在您的数据中包含一个没有行的部分,并将表格标题的视图放在该部分标题视图中。

【讨论】:

  • 这不是section header,这是tableHeaderView
  • 知道了。误解了这个问题。
【解决方案3】:

有两种方法可以设置表头:

  • 直接使用.tableHeaderView属性(此标题随表格滚动)

  • 覆盖- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 函数(此标头与该部分保持静态)

您应该使用第二种方法而不是使用.tableHeaderView 属性

【讨论】:

  • 我不认为这是正确的。我的部分标题上下滚动,并在您滚动时粘在表格视图的顶部,直到另一个部分标题将其推开。
  • tableHeaderView 是整个表格的标题,而viewForHeaderInSection 在每个部分都放置一个标题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 2020-09-15
  • 2013-01-22
相关资源
最近更新 更多