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

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

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

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

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

Спасибо.

Ответы [ 20 ]

173 голосов
/ 21 октября 2010

Я решил эту проблему, настроив contentOffset в соответствии с contentInset в UITableViewControllerDelegate (расширяет UIScrollViewDelegate) следующим образом:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
       CGFloat sectionHeaderHeight = 40;
   if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
       scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
   } else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
       scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
   }
}

Единственная проблема здесь в том, что он немного теряет отскок при прокрутке вверх.


{ПРИМЕЧАНИЕ: «40» должно быть точной высотой ВАШЕГО заголовка секции 0. Если вы используете число, которое больше, чем высота заголовка раздела 0, вы увидите, что это влияет на ощущение пальца (попробуйте как «1000», и вы увидите, что поведение отскока вверху странно). если число соответствует высоте заголовка вашего раздела 0, ощущение пальца кажется либо идеальным, либо почти идеальным.}

86 голосов
/ 26 февраля 2011

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

35 голосов
/ 20 декабря 2009

Если бы я это делал, я бы использовал тот факт, что UITableViews в простом стиле имеют липкие заголовки, а в сгруппированном - нет. Я бы, по крайней мере, попытался бы использовать пользовательскую ячейку таблицы для имитации появления простых ячеек в сгруппированной таблице.

На самом деле я не пробовал это, так что это может не сработать, но я бы предложил это сделать.

28 голосов
/ 02 декабря 2011

Я знаю, что уже поздно, но я нашел окончательное решение!

Что вы хотите сделать, если у вас есть 10 разделов, пусть dataSource возвращает 20. Используйте четные числа для заголовков разделов и нечетные числа для содержимого разделов. как то так

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }else {
        return 5;
    }
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        return [NSString stringWithFormat:@"%i", section+1];
    }else {
        return nil;
    }
}

Вуаля! : D

15 голосов
/ 01 августа 2011

Есть несколько вещей, которые нужно сделать, чтобы решить эту проблему не хакерским способом:

  1. Установить стиль представления таблицы на UITableViewStyleGrouped
  2. Установить вид таблицы backgroundColor на [UIColor clearColor]
  3. Установите backgroundView в каждой ячейке табличного представления на пустое представление с помощью backgroundColor [UIColor clearColor]
  4. Если необходимо, установите табличное представление rowHeight соответствующим образом или переопределите tableView:heightForRowAtIndexPath:, если отдельные строки имеют разную высоту.
15 голосов
/ 30 января 2013

Первоначально опубликовано Здесь , быстрое решение с использованием IB. То же самое можно сделать программно, хотя и довольно просто.

Вероятно, более простой способ добиться этого (с использованием IB):

Перетащите UIView на TableView, чтобы сделать его заголовком.

  1. Установить высоту представления заголовка на 100px
  2. Установите для параметра viewview contentInset (top) значение -100
  3. Заголовки разделов теперь будут прокручиваться, как и любая обычная ячейка.

Некоторые люди говорили, что это решение скрывает первый заголовок, однако я не заметил такой проблемы. Он отлично сработал для меня и был самым простым решением, которое я когда-либо видел.

14 голосов
/ 28 февраля 2013

Я не был доволен решениями, описанными здесь до сих пор, поэтому я попытался объединить их. В результате получается следующий код, вдохновленный @awulf и @cescofry. Это работает для меня, потому что у меня нет реального заголовка табличного представления. Если у вас уже есть заголовок табличного представления, возможно, вам придется настроить высоту.

// Set the edge inset
self.tableView.contentInset = UIEdgeInsetsMake(-23.0f, 0, 0, 0);

// Add a transparent UIView with the height of the section header (ARC enabled)
[self.tableView setTableHeaderView:[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 23.0f)]];
14 голосов
/ 15 июля 2015

Просто измените стиль TableView:

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

Документация UITableViewStyle :

UITableViewStylePlain- Простой вид таблицы. Все верхние или нижние колонтитулы раздела отображаются как встроенные разделители и плавают при прокрутке табличного представления.

UITableViewStyleGrouped- Табличное представление, разделы которого представляют различные группы строк. Верхние и нижние колонтитулы раздела не плавают.

6 голосов
/ 04 апреля 2017

Select Grouped TableView style

Выберите стиль сгруппированного табличного представления из инспектора атрибутов вашего tableView в раскадровке.

5 голосов
/ 08 мая 2016

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

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

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

UITableViewStylePlain - Простое табличное представление. Любые заголовки разделов или нижние колонтитулы отображаются как встроенные разделители и плавают, когда таблица просмотр прокручивается.

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

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