当我需要将其与部分标题和索引栏一起使用时,此页面上的早期解决方案给我带来了一些麻烦,因此我自己想出了以下替代方案。请注意; 我的项目中没有使用自动布局,我只在 iOS9+ 上测试过;
在项目的故事板中:
- 在 UIViewController 中创建 UITableView(或使用 UITableViewController 尝试)。
- 在 UITableView 顶部(但在内部)放置一个 UIView,使其成为第一个单元格上方的表头。
- 给这个标题视图一个所需的高度(例如 200 像素)并将背景颜色设置为“清除颜色”。清除颜色很重要,视图需要透明。
- 在表头 UIView 中放置第二个 UIView 并使其大小与其父级相同。这将是实际的标题,因此请随意给它任何颜色,设置图像视图或其他内容。
- 将此第二个 UIView 连接到您的 UIViewController IBOutlet,我将其命名为“headerView”。
接下来,转到您的 UIViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
// Remove view from table header and place it in the background instead.
[self.headerView removeFromSuperview];
UIView *backgroundView = [UIView new];
[backgroundView addSubview:self.headerView];
self.tableView.backgroundView = backgroundView;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
/* Set initialScrollOffset ivar to start offset, because in my case
the scroll offset was affected by the statusbar + navigation bar heights
and the view controller's "extend edges under top bars" option. */
initialScrollOffset = self.tableView.contentOffset.y;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
/* Modify headerView height only if the table content gets pulled
beyond initial offset. */
if (scrollView.contentOffset.y < initialScrollOffset) {
CGRect frame = self.headerView.frame;
frame.size.height = self.tableView.tableHeaderView.frame.size.height + -scrollView.contentOffset.y;
self.headerView.frame = frame;
}
}
我只需要这个实现用于具有背景颜色和标签的拉伸标题。不过,将 UIImageView 添加到此标头应该很容易。
此外,步骤 1 到 5 当然是完全可选的。您可以以编程方式创建标题视图或使用 XIB。只要您确保表格具有与所需标题相同的高度设置的 Clear Colored 标题视图,因为这可以用作保持单元格和节标题对齐的间隔。
编辑:
我找到了一种更清洁的方法来实现这一点;
- 如上所述在界面构建器中构建表头: 1 UIView 作为容器,其中嵌入了第二个 UIView。
- 跳过
viewDidLoad
上面的代码,不需要将 UIView 拉出它的容器,我们也不需要将它设置为表格背景。
- 将方法更改为
scrollViewDidScroll:
:
UIViewController.m:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y < initialScrollOffset) {
CGRect frame = self.headerView.frame;
frame.size.height = self.tableView.tableHeaderView.frame.size.height - scrollView.contentOffset.y;
frame.origin.y = self.tableView.tableHeaderView.frame.origin.y + scrollView.contentOffset.y;
self.headerView.frame = frame;
}
}
而已。与其他解决方案的唯一视觉区别是内容现在将与其余单元格一起向上滚动,而不是被它们重叠。