web-dev-qa-db-fra.com

UITableView avec en-têtes de section fixe

Greets, je lis que le comportement par défaut de UITableView consiste à épingler les lignes d’en-tête de section en haut du tableau lorsque vous faites défiler les sections jusqu’à ce que la section suivante fasse ressortir la ligne de section précédente.

J'ai un UITableView à l'intérieur d'un UIViewController et cela ne semble pas être le cas.

Est-ce juste le comportement par défaut pour UITableViewController?

Voici un code simplifié basé sur ce que j'ai. Je vais montrer l'interface UIController et chaque méthode de vue tabulaire que j'ai implémentée pour créer la vue tabulaire. J'ai une classe de source de données d'assistance qui m'aide à indexer mes objets pour une utilisation avec la table.

    @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;
}
97
topwik

Les en-têtes ne restent fixes que lorsque la propriété UITableViewStyle de la table est définie sur UITableViewStylePlain. Si vous le définissez sur UITableViewStyleGrouped, les en-têtes défileront avec les cellules.

280
bachonk

Swift 3.

Créez un ViewController avec les protocoles ITableViewDelegate et ITableViewDataSource. Créez ensuite une tableView à l'intérieur, en déclarant que son style est ITableViewStyle.grouped. Cela corrigera les en-têtes.

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
}()
2

Changez votre style TableView:

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

Selon la documentation Apple pour UITableView:

UITableViewStylePlain - Une vue de table simple. Tous les en-têtes de section ou les pieds de page sont affichés sous forme de séparateurs en ligne et flottants lorsque la vue tabulaire défile.

UITableViewStyleGrouped: une vue de tableau dont les sections présentent des groupes de lignes distincts. Les en-têtes et les pieds de section ne flottent pas.

J'espère que ce petit changement vous aidera.

2
Aks

Vous pouvez également définir la propriété bounces de la tableview sur NO. Cela gardera les en-têtes de section non flottants/statiques, mais vous perdrez également la propriété bounce de la vue de table.

1
kevinl

pour que l'en-tête des sections UITableView ne soit pas collant ou collant:

  1. changez le style de la vue de la table - faites-la groupée pour ne pas coller et mettez-la en clair pour les en-têtes de section collantes - n'oubliez pas: vous pouvez le faire à partir du storyboard sans écrire de code. (cliquez sur votre vue tableau et changez le style dans le menu latéral/composant de droite)

  2. si vous avez des composants supplémentaires tels que des vues personnalisées ou autres, veuillez vérifier les marges de la vue de tableau pour créer une conception appropriée. (comme la hauteur de l'en-tête pour les sections et la hauteur de la cellule dans le chemin d'index, les sections)

0
Burcu K. Kutluay

Désormais, votre vue table ressemble à un style de table simple, mais ne modifiez pas le style de table de buz en groupe.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
0
Ravi Kumar