UITableView с фиксированными заголовками разделов


107

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

У меня есть UITableViewвнутри a, UIViewControllerи это, похоже, не так.

Это просто поведение по умолчанию UITableViewController?

Вот упрощенный код на основе того, что у меня есть. Я покажу UIControllerинтерфейс и каждый метод представления таблицы, который я реализовал для создания представления таблицы. У меня есть вспомогательный класс источника данных, который помогает мне индексировать мои объекты для использования с таблицей.

    @interface MyUIViewController ()<UITableViewDelegate, UITableViewDataSource>
        @property (nonatomic, readonly) UITableView *myTableView;
        @property (nonatomic, readonly) MyCustomHelperDataSource *helperDataSource;
    @end

    //when section data is set, get details for each section and reload table on success
    - (void)setSectionData:(NSArray *)sections {
        super.sectionData = sections; //this array drives the sections

        //get additional data for section details
        [[RestKitService sharedClient] getSectionDetailsForSection:someId 
        success:^(RKObjectRequestOperation *operation, RKMappingResult *details) {
            NSLog(@"Got section details data");
            _helperDataSource = [[MyCustomHelperDataSource alloc] initWithSections:sections andDetails:details.array];
            [myTableView reloadData];
        } failure:^(RKObjectRequestOperation *operation, NSError *error) {
            NSLog(@"Failed getting section details");
        }];
    }

    #pragma mark <UITableViewDataSource, UITableViewDelegate>

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        if (!_helperDataSource) return 0;
        return [_helperDataSource countSectionsWithDetails]; //number of section that have details rows, ignore any empty sections
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        //get the section object for the current section int
        SectionObject *section = [_helperDataSource sectionObjectForSection:section];
        //return the number of details rows for the section object at this section
        return [_helperDataSource countOfSectionDetails:section.sectionId];
    }

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

        UITableViewCell * cell;

        NSString *CellIdentifier = @"SectionDetailCell";

        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
            cell.textLabel.font = [UIFont systemFontOfSize:12.0f];
        }

        //get the detail object for this section
        SectionObject *section = [_helperDataSource sectionObjectForSection:indexPath.section]; 

        NSArray* detailsForSection = [_helperDataSource detailsForSection:section.sectionId] ;
        SectionDetail *sd = (SectionDetail*)[detailsForSection objectAtIndex:indexPath.row];

        cell.textLabel.text = sd.displayText;
        cell.detailTextLabel.text = sd.subText;
        cell.detailTextLabel.textColor = [UIColor blueTextColor];

        return cell;
    }

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 50.0f;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 30.0f;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section {
    //get the section object for the current section
    SectionObject *section = [_helperDataSource sectionObjectForSection:section]; 

    NSString *title = @"%@ (%d)";

    return [NSString stringWithFormat:title, section.name, [_helperDataSource countOfSectionDetails:section.sectionId]];
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 260, 0)];
    header.autoresizingMask = UIViewAutoresizingFlexibleWidth;

    header.backgroundColor = [UIColor darkBackgroundColor];

    SSLabel *label = [[SSLabel alloc] initWithFrame:CGRectMake(3, 3, 260, 24)];
    label.font = [UIFont boldSystemFontOfSize:10.0f];
    label.verticalTextAlignment = SSLabelVerticalTextAlignmentMiddle;
    label.backgroundColor = [UIColor clearColor];
    label.text = [self tableView:tableView titleForHeaderInSection:section];
    label.textColor = [UIColor whiteColor];
    label.shadowColor = [UIColor darkGrayColor];
    label.shadowOffset = CGSizeMake(1.0, 1.0);
    [header addSubview:label];

    return header;
}

Это должно сработать. Покажи код.
Matthias Bauch

Это отличный способ использования UITableView, который должен работать с заголовками. Что заголовки не делают в вашем случае?
Эрик

@Eric, заголовки прокручиваются вместе со строками. Пока я прокручиваю, они не останавливаются наверху таблицы. Я добавил код, который использую для создания представления таблицы. Это UITableView внутри UIViewController.
topwik

Ответы:


305

Заголовки остаются фиксированными, только если для UITableViewStyleсвойства таблицы установлено значение UITableViewStylePlain. Если у вас установлено значение UITableViewStyleGrouped, заголовки будут прокручиваться вверх вместе с ячейками.


3
мой стиль tableview - UITableViewStylePlain, но он также прокручивается вместе с ячейками.
yudun1989

8
Этому есть несколько возможных объяснений. Одно важное замечание: заголовки останутся фиксированными только для ячеек в его разделе. Итак, если у вас есть заголовок в разделе 0, он не останется фиксированным для ячеек в разделе 1. Другое возможное объяснение заключается в том, что вы не инициализируете свой UITableView с правильным стилем. Рекомендуется использовать initWithStyle:UITableViewStylePlain, так как вызов чего-то вроде tableView.style = UITableViewStylePlain не сработает.
bachonk

UITableViewStyleGrouped фиксирует верхний / нижний колонтитул с другими ячейками, в то время как UITableViewStylePlain делает верхний / нижний колонтитул «плавающим», когда верхний / нижний колонтитул достигает верха / низа представления таблицы.
StoneLam

@bachonk Я использую растягиваемый заголовок. и мой стиль - UITableViewStyleGrouped. я хочу исправить заголовок при прокрутке вверх. если я сделаю это UITableViewStylePlain, тогда заголовок фиксируется в середине экрана, я хочу прокрутить заголовок вниз, но при прокрутке вверх я хочу, чтобы он исправился в первой строке ... возможно ли это?
Разработчик Gorib 02

3

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

self.tableview = [[UITableView alloc] initwithFrame: стиль фрейма: UITableViewStyleGrouped];

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

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

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

Надеюсь, это небольшое изменение поможет вам ...


2
похоже, это прямо противоположно тому, о чем спрашивал вопрос - это должно быть Plain, а неGrouped
CupawnTae

1

Swift 3.0

Создайте ViewController с протоколами UITableViewDelegate и UITableViewDataSource . Затем создайте внутри него tableView, объявив его стиль как UITableViewStyle.grouped . Это исправит заголовки.

lazy var tableView: UITableView = {
    let view = UITableView(frame: UIScreen.main.bounds, style: UITableViewStyle.grouped)
    view.delegate = self
    view.dataSource = self
    view.separatorStyle = .none
    return view
}()

0

Вы также можете установить для свойства bounces tableview значение NO. Это сохранит заголовки разделов неплавающими / статическими, но тогда вы также потеряете свойство bounce для tableview.


0

чтобы сделать заголовок разделов UITableView не липким или липким:

  1. измените стиль представления таблицы - сделайте его сгруппированным, чтобы он не был липким, и сделайте его простым для липких заголовков разделов - не забывайте: вы можете сделать это из раскадровки без написания кода. (щелкните вид таблицы и измените его стиль в правой части меню / компонента)

  2. если у вас есть дополнительные компоненты, такие как пользовательские представления и т. д., проверьте поля табличного представления, чтобы создать соответствующий дизайн. (например, высота заголовка для разделов и высота ячейки в пути индекса, разделы)


-2

Теперь ваше tableview выглядит как обычный стиль таблицы, но не перемещает стиль таблицы настройки buz, установленный на group.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.