Предыдущие решения на этой странице дали мне некоторые проблемы, когда мне это нужно, чтобы работать вместе с заголовками разделов и индексной панелью, поэтому я придумал следующую альтернативу. Пожалуйста, обратите внимание; Я не использую автозапуск в своем проекте, и я тестировал это только на iOS9 +;
В раскадровке вашего проекта:
Затем перейдите к вашему 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. До тех пор, пока вы убедитесь, что таблица имеет вид с четким цветным заголовком с той же высотой, что и ваш желаемый заголовок, потому что это служит в качестве разделителя, чтобы сохранить ваши ячейки и заголовки разделов в строке.
EDIT:
Я нашел еще более чистый способ выполнить это:
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;
}
}
Вот и все. Только визуальное отличие от другого решения состоит в том, что содержимое теперь будет прокручиваться вместе с остальными ячейками, а не перекрываться ими.