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


106

Вітаю, я читаю, що поведінка за замовчуванням UITableViewполягає в закріпленні рядків заголовків розділів у верхній частині таблиці під час прокручування розділів, поки наступний розділ не виштовхне з поля перегляду розділ "Previos".

У мене 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;
}

Це має спрацювати. Покажіть якийсь код.
Маттіас Баух

Це абсолютно чудовий спосіб використання UITableView і повинен працювати з заголовками. Що у вашому випадку не роблять заголовки?
Ерік

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

Відповіді:


304

Заголовки залишаються фіксованими лише тоді, коли встановлено UITableViewStyleвластивість таблиці UITableViewStylePlain. Якщо у вас встановлено значення UITableViewStyleGrouped, заголовки будуть прокручуватися вгору з комірками.


3
мій стиль перегляду таблиць - UITableViewStylePlain, але він також прокручується вгору з осередками.
yudun1989

8
Для цього є кілька можливих пояснень. Одне важливе зауваження полягає в тому, що заголовки залишаться зафіксованими лише для комірок у межах його розділу. Отже, якщо у вас є заголовок у розділі 0, він не залишатиметься фіксованим для комірок у розділі 1. Іншим можливим поясненням є те, що ви не ініціалізуєте свій UITableView належним стилем. Рекомендується використовувати initWithStyle:UITableViewStylePlain, оскільки виклик чогось типу tableView.style = UITableViewStylePlain не працюватиме.
бачонк

UITableViewStyleGrouped робить заголовок / нижній колонтитул фіксованим за допомогою інших комірок, тоді як UITableViewStylePlain змушує заголовок / колонтитул "плавати", коли заголовок / колонтитул досягають верхньої та нижньої частини таблиці.
StoneLam

@bachonk я використовую розтягування подання заголовка. і мій стиль - UITableViewStyleGrouped. я хочу виправити заголовок під час прокрутки вгору. якщо я зроблю це UITableViewStylePlain, тоді заголовок фіксується посередині екрана, я хочу прокрутити заголовок вниз, але при прокручуванні вгору я хочу, щоб він виправився на першому рядку .. чи можливо це?
Гориб Розробник

2

Змініть свій стиль 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

Ви також можете встановити властивість відмов у таблиці. Це дозволить зберегти заголовки розділів не плаваючими / статичними, але тоді ви також втратите властивість відмов таблиці.


0

щоб заголовок розділів UITableView не був липким або липким:

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

  2. якщо у вас є додаткові компоненти, такі як власні подання тощо, перевірте межі подання таблиці, щоб створити відповідний дизайн. (наприклад, висота заголовка для секцій та висота комірки в індексному шляху, секції)


-2

Тепер ваш набір таблиць виглядає як стиль простого столу, але не плаваючи через buz, встановлюючи стиль таблиці, встановлений у групу.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.