【问题标题】:Is it possible to have a fixed uitableview Header while using sections?使用部分时是否可以有一个固定的 uitableview 标题?
【发布时间】:2014-07-21 02:21:42
【问题描述】:

此问题不应与此here. 混淆。这是两个不同的东西。

有一个good example 如何在 SO 上使用 UITableView Header。

这一切都很好,只要样式设置为plain,主标题就固定在顶部。

但如果我使用sections,则主标题不再停留在顶部并在滚动到底部时移开。

在这种方法中,我返回每个部分的标题。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

在这种方法中,我正在为上面的标题部分设置高度:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

在这个方法中,我设置的是真正的表头。

- (void)viewWillAppear:(BOOL)animated {
    ...
    self.recordTableView.tableHeaderView = headerView;
}

在使用部分时甚至可以有一个固定的表头吗? 请问有什么替代解决方案?

【问题讨论】:

标签: ios uitableview


【解决方案1】:

如果你想要一个 UITableViewController(静态单元格/键盘处理)并且有一个固定的标题,那么你应该使用 Containment。您可以从 Storyboard 中执行此操作,方法是使用固定标题设置 UIViewController,然后使用 Container View 嵌入 UITableViewController。

一旦您设置了包含视图,您可以右键单击从容器视图拖动到要嵌入的视图控制器 - 在本例中为 UITableViewController。

您可以通过实现prepareForSegue:sender: 方法从容器视图控制器访问并获取对包含的视图控制器(UITableViewController)的引用。

【讨论】:

  • 您不需要容器视图。您可以直接将表格添加到视图控制器,但当然不能全屏。在表格上方创建静态视图。
  • @C6Silver UITableViewController 可以比带有 UITableView 的常规 UIViewController 更好,正如我在回答开头所述(静态单元格/键盘处理)。
  • @Joony 根据你的括号非常公平。
  • 这当然是最好的方法,但是一个问题是,如果您打算使用 refreshControl 和添加到 navigationItem 的 searchController,那么当您拉动刷新时,tableView 内容将向下移动,但固定标题不会并被橡皮筋导航栏覆盖。所以如果需要一个 searchBar 最好添加为 tableView.tableHeaderView 直到它被排序。
【解决方案2】:

没有办法保持tableView 的标头固定,但是 当您需要一个唯一的标头时,一种有用的方法是使用UIViewController 而不是UITableViewController,并从tableView 设置标头 (UIView) out

类似这样的:

【讨论】:

  • :) 在任何情况下都不起作用。您必须决定采用哪种方式才能达到您想要的效果。静态单元格不是问题,如果您需要在 tableView 上方使用静态视图,则可以避免使用,否则没有理由拥有一个名为 UITableViewController 的对象,并且一个 UITableView 可插入到另一个视图中。
  • @Alon_T 您可以将静态表视图包含为嵌入式 vc
  • 但这不是一个好的解决方案,特别是当您在底部有标签栏项目,并且 tableview 的视图有限并且当您想要向下滚动 tableview 时,您可能希望顶部导航栏滚动到top 使其脱离视图,并且标题将粘在顶视图上。从tableview中取出header会让你很难达到这个效果。
  • 这很好。例如,您应该使表格视图全屏,然后调整内容插入和滚动指示器插入。
  • 如果你使用UIViewController,那么你将失去UITableViewController提供的自动键盘处理
【解决方案3】:

如果您想将类保留为 UITableViewController,您可以将标题作为子视图添加到 tableview 的超级视图。您还必须将 tableview 顶部插入向下推,这样您的 headerview 就不会隐藏表格。

这是一个放入 tableViewController 子类的示例代码(此示例假设您的 tableview 控制器位于导航控制器内,因此它将视图推送到导航栏下方):

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.automaticallyAdjustsScrollViewInsets = NO;

}

-(void)addHeaderView{
    CGFloat yPosition = self.navigationController.navigationBar.frame.origin.y + self.navigationController.navigationBar.frame.size.height;
    mainHeaderView = [[UIView alloc] init];

    const CGFloat mainHeaderHeight = 44;
    [mainHeaderView setFrame:CGRectMake(0, yPosition, self.view.frame.size.width, mainHeaderHeight)];

    mainHeaderView.backgroundColor = [UIColor redColor];

    [self.tableView.superview addSubview:mainHeaderView];
    [self.tableView setContentInset:UIEdgeInsetsMake(yPosition + mainHeaderHeight, self.tableView.contentInset.left, self.tableView.contentInset.bottom, self.tableView.contentInset.right)];
 }

【讨论】:

    【解决方案4】:

    我还没有这样做,但我想尝试的第一件事是将我的表格视图放在UIView 中,并在该UIView 中创建我自己的标题。使该视图看起来是表格的标题似乎是一件微不足道的事情,而且它肯定会保持不变。

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      相关资源
      最近更新 更多