Изменить стандартное поведение прокрутки заголовка раздела UITableView - PullRequest
143 голосов
/ 20 марта 2009

У меня есть UITableView с двумя разделами. Это простой вид таблицы. Я использую viewForHeaderInSection для создания пользовательских представлений для этих заголовков. Пока все хорошо.

Режим прокрутки по умолчанию заключается в том, что при обнаружении раздела заголовок раздела остается закрепленным под панелью навигации до тех пор, пока не отобразится следующий раздел.

У меня такой вопрос: могу ли я изменить поведение по умолчанию, чтобы заголовки разделов НЕ оставались привязанными вверху, а прокручивались под панелью навигации с остальными строками разделов?

Я что-то упускаю из виду?

Спасибо.

Ответы [ 20 ]

4 голосов
/ 11 августа 2011

Установите заголовок таблицы с прозрачным видом с той же высотой заголовка в разрезе. Также можно начать просмотр таблицы с y-кадром в -height.

self.tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, - height, 300, 400)];

UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)] autorelease];
[self.tableView setTableHeaderView:headerView];
4 голосов
/ 19 октября 2012

Я нашел альтернативное решение, используйте первую ячейку каждого раздела вместо реального раздела заголовка, это решение не выглядит таким чистым, но работает настолько хорошо, что вы можете использовать определенную ячейку прототипа для раздела заголовков, и в метод cellForRowAtIndexPath запрашивает indexPath.row == 0, если true, используйте ячейку прототипа раздела заголовка, иначе используйте вашу ячейку прототипа по умолчанию.

2 голосов
/ 09 апреля 2014

Теперь, когда сгруппированный стиль выглядит в основном так же, как обычный стиль в iOS 7 (с точки зрения плоскостности и фона), для нас самым лучшим и простым (т.е. наименее хакерским) решением было просто изменить стиль табличного представления на сгруппированный , Поддавливание с помощью contentInsets всегда было проблемой, когда мы интегрировали прокручиваемую навигационную панель вверху. При использовании стиля сгруппированного табличного представления он выглядит точно так же (с нашими ячейками), а заголовки разделов остаются неизменными. Никаких странностей прокрутки.

1 голос
/ 09 октября 2010

Назначьте отрицательную вставку для вашего tableView. Если у вас есть заголовки секций высотой 22px, и вы не хотите, чтобы они были липкими, сразу после перезагрузки Data add:

self.tableView.contentInset = UIEdgeInsetsMake(-22, 0, 0, 0); 
self.tableView.contentSize = CGSizeMake(self.tableView.contentSize.width, self.tableView.contentSize.height+22); 

Работает как шарм для меня. Также работает для нижних колонтитулов, вместо этого просто назначьте отрицательную вставку внизу.

0 голосов
/ 06 декабря 2012

Проверьте мой ответ здесь . Это самый простой способ реализовать заголовки не плавающих разделов. без всяких взломов.

0 голосов
/ 07 сентября 2016

Swift-версия ответа @awulf, который отлично работает!

func scrollViewDidScroll(scrollView: UIScrollView) {
    let sectionHeight: CGFloat = 80
    if scrollView.contentOffset.y <= sectionHeight {
        scrollView.contentInset = UIEdgeInsetsMake( -scrollView.contentOffset.y, 0, 0, 0)
    }else if scrollView.contentOffset.y >= sectionHeight {
        scrollView.contentInset = UIEdgeInsetsMake(-sectionHeight, 0, 0, 0)
    }
}
0 голосов
/ 08 мая 2016

Измените ваш стиль TableView:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

Согласно документации Apple для UITableView:

UITableViewStylePlain- A plain table view. Any section headers or footers are displayed as inline separators and float when the table view is scrolled.

UITableViewStyleGrouped- A table view whose sections present distinct groups of rows. The section headers and footers do not float.
Hope this small change will help you ..
0 голосов
/ 21 апреля 2013

@ Ответ LocoMike лучше всего подходил для моего tableView, однако он сломался и при использовании нижних колонтитулов. Итак, это исправленное решение при использовании верхних и нижних колонтитулов:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return (self.sections.count + 1) * 3;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section % 3 != 1) {
        return 0;
    }
    section = section / 3;
    ...
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    if (section % 3 != 0) {
        return nil;
    }
    section = section / 3;
    ...
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section % 3 != 0) {
        return 0;
    }
    section = section / 3;
    ...
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    if (section % 3 != 2) {
        return 0;
    }
    section = section / 3;
    ...
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if (section % 3 != 0) {
        return nil;
    }
    section = section / 3;
    ...
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    if (section % 3 != 2) {
        return nil;
    }
    section = section / 3;
    ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    int section = indexPath.section;
    section = section / 3;
    ...
}
0 голосов
/ 23 января 2012

Я узнал, что просто установка свойства tableHeaderView делает это, то есть:

 tableView.tableHeaderView = customView;

и все.

0 голосов
/ 10 мая 2010

Я добавляю таблицу в представление прокрутки, и это, кажется, работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...