在使用故事板时,如何在IB中为UITableView添加页脚视图?

时间:2013-11-11 16:44:08

标签: ios objective-c uitableview storyboard autolayout

使用原型单元格,我需要在表格视图的底部添加页脚视图,这样当用户滚动到表格视图的底部时,用户就可以看到此页脚视图。因此,创建了具有一个屏幕,表视图和两个原型单元的演示项目。寻找一种方法如何使用Interface Builder将一些视图拖放到表下方。问题是它看起来像是放在表格视图内容之外,所以我看到页脚但是我无法滚动到它(在表格视图的底部只能看到页脚视图的一小部分)。

我知道这应该可行,因为已经看到了一个有效的实现,但无法弄清楚我需要添加什么神奇的设置或代码行。

以下是方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

  return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section {

  return 2;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath  *)indexPath {

  CGFloat rowHeight = 10;

  switch (indexPath.row) {

    case 0: {

        rowHeight = 376;

        break;
    }
    case 1: {

        rowHeight = 105;

        break;
    }
  } 

  return rowHeight;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  switch (indexPath.row) {

    case 0: {

        Cell1 *cell1 = [tableView dequeueReusableCellWithIdentifier:@"Cell1" forIndexPath:indexPath];
        return cell1;

        break;
    }
    case 1: {

        Cell2 *cell2 = [tableView dequeueReusableCellWithIdentifier:@"Cell2" forIndexPath:indexPath];
        return cell2;

        break;
    }
  }

  return nil;
}

用两个不同高度的单元格制作2行表。 Cell1和Cell2类是UITableViewCell的空子类。

以下是表视图和单元格在界面构建器中的外观:

enter image description here

这是发布后的初始视图:

enter image description here

如果我滚动到底部,这就是我看到的内容:

enter image description here

页脚在那里,但在桌面视图外(滚动内容)。正如您所看到的,默认情况下,表视图会在页脚底部保留大约44px的空间作为页脚。但是,如果我在tableView:heightForFooterInSection中设置页脚高度,则会出现空格。

此外,尝试将此视图拖动并移动到IB中的视图层次结构,因此视图将成为标题视图。在这种情况下,视图在顶部显示为标题视图,但是当滚动到底部时,第二个单元格仅部分显示。它看起来像计算显示原型动态单元所需的空间(为表视图设置了“动态原型”)。如果您向界面构建器添加额外的页脚或标题视图,则单元格的空间较小(如果视图被添加为标题)或页脚未显示。

更新即可。如果我添加此方法,则会出现空格:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {

  return 50;
}

这是我在这种情况下得到的结果(cell2下面的空格):

enter image description here

UPDATE2 如果禁用自动布局,则会正确显示页脚。

2 个答案:

答案 0 :(得分:2)

我认为你错过了以下一行

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{

    return HEIGHT_OF_YOUR_FOOTER_VIEW;

}

修改

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{

    UIView *footer=[[UIView alloc] initWithFrame:CGRectMake(0,0,320.0,50.0)];
    footer.layer.backgroundColor = [UIColor orangeColor].CGColor;


    return footer;    
}

<强>更新

选中此documentation

答案 1 :(得分:1)

终于找到了解决方案。注意到在禁用自动布局时正确显示了页脚,因此开始查看约束。因此,使用Ctrl + Drag将容器,尾随空格,底部空间和顶部空间的前导空间添加到容器约束到表视图。然而,IB显示关于缺少Y位置约束的红色警告。因此,在从IB建议面板中选择“添加缺失约束”之后,IB添加了另一个系统约束,但页脚仍未正确显示。看起来IB无法为容器系统约束添加正确的顶部空间和底部空间,甚至无法修复它。所以我得到了5个系统约束:

enter image description here

使用Ctrl +从表视图拖动到包含视图的系统约束在我之前的演示中已经有效。但是,这次IB无法为容器添加正确的顶部空间和底部空间,因此顶部空间垂直约束的值为-568。尝试设置为0但它没有奏效。尝试了十次删除所有约束并再次添加它们。同样的结果。

因此,我删除了所有这些垂直(底部和空间)约束,然后选择“添加缺失约束”。和宾果! IB添加了正确的垂直约束,并且正确显示了页脚视图。这是正确的约束应该是什么样子。但是,当我从表视图执行Ctrl + Drag到容器视图时,我仍然不明白为什么IB无法添加正确的约束。

enter image description here