UITableView con intestazioni a sezione fissa


107

Saluta, sto leggendo che il comportamento predefinito di UITableViewè quello di bloccare le righe di intestazione della sezione nella parte superiore della tabella mentre scorri le sezioni fino a quando la sezione successiva non spinge la riga della sezione precedente fuori dalla vista.

Ho un UITableViewinterno a UIViewControllere non sembra essere il caso.

È solo il comportamento predefinito per UITableViewController?

Ecco un po 'di codice semplificato basato su quello che ho. Mostrerò l' UIControllerinterfaccia e ogni metodo di visualizzazione tabella che ho implementato per creare la visualizzazione tabella. Ho una classe di origine dati di supporto che mi aiuta a indicizzare i miei oggetti per l'uso con la tabella.

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

Dovrebbe funzionare. Mostra del codice.
Matthias Bauch

Questo è un modo completamente eccellente per usare un UITableView e dovrebbe funzionare con le intestazioni. Cosa non fanno le intestazioni nel tuo caso?
Eric,

@Eric le intestazioni stanno scorrendo con le righe. Non si fermano in cima al tavolo mentre scorro. Ho aggiunto il codice che sto usando per generare la mia visualizzazione tabella. È un UITableView all'interno di un UIViewController.
topwik

Risposte:


305

Le intestazioni rimangono fisse solo quando la UITableViewStyleproprietà della tabella è impostata su UITableViewStylePlain. Se lo hai impostato UITableViewStyleGrouped, le intestazioni scorreranno verso l'alto con le celle.


3
il mio stile tableview è UITableViewStylePlain, ma scorre anche verso l'alto con le celle.
yudun1989

8
Ci sono un paio di possibili spiegazioni per questo. Una nota importante è che le intestazioni rimarranno fisse solo per le celle all'interno della sua sezione. Quindi, se hai un'intestazione nella sezione 0, non rimarrà fissa per le celle nella sezione 1. Un'altra possibile spiegazione è che non stai inizializzando UITableView con lo stile corretto. Si consiglia di utilizzare initWithStyle:UITableViewStylePlain, poiché chiamare qualcosa come tableView.style = UITableViewStylePlain non funzionerà.
bachonk

UITableViewStyleGrouped fissa l'intestazione / piè di pagina con altre celle, mentre UITableViewStylePlain rende l'intestazione / piè di pagina "fluttuante" quando l'intestazione / piè di pagina raggiunge la parte superiore / inferiore di tableview.
StoneLam

@bachonk sto usando una vista di intestazione estensibile. e il mio stile è UITableViewStyleGrouped. voglio correggere l'intestazione durante lo scorrimento verso l'alto. se lo faccio UITableViewStylePlain, l'intestazione viene fissata al centro dello schermo, voglio scorrere l'intestazione verso il basso, ma quando scorro verso l'alto voglio che si aggiusti sulla prima riga .. può essere possibile?
Gorib Developer

3

Cambia il tuo stile TableView:

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

Come da documentazione Apple per UITableView:

UITableViewStylePlain: una visualizzazione semplice della tabella. Eventuali intestazioni o piè di pagina di sezione vengono visualizzati come separatori in linea e sono mobili quando si scorre la vista tabella.

UITableViewStyleGrouped: una vista tabella le cui sezioni presentano gruppi di righe distinti. Le intestazioni e i piè di pagina delle sezioni non sono mobili.

Spero che questo piccolo cambiamento ti possa aiutare ..


2
questo sembra essere esattamente l'opposto di ciò che la domanda richiedeva - dovrebbe essere Plain, nonGrouped
CupawnTae

1

Swift 3.0

Crea un ViewController con i protocolli UITableViewDelegate e UITableViewDataSource . Quindi crea un tableView al suo interno, dichiarando che il suo stile è UITableViewStyle.grouped . Questo risolverà le intestazioni.

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

Puoi anche impostare la proprietà bounces di tableview su NO. Ciò manterrà le intestazioni delle sezioni non fluttuanti / statiche, ma perderai anche la proprietà bounce della tableview.


0

per rendere le intestazioni delle sezioni UITableView non appiccicose o appiccicose:

  1. cambia lo stile della vista tabella - rendila raggruppata per non appiccicosa e rendila semplice per le intestazioni delle sezioni appiccicose - non dimenticare: puoi farlo dallo storyboard senza scrivere codice. (fai clic sulla vista della tabella e cambia lo stile dal menu laterale destro / componente)

  2. se hai componenti extra come viste personalizzate o così via, controlla i margini della vista tabella per creare un design appropriato. (come l'altezza dell'intestazione per le sezioni e l'altezza della cella nel percorso dell'indice, sezioni)


-2

Ora la tua vista da tavolo sembra un semplice stile da tavolo ma non fluttuare per impostare lo stile di tabella impostato su gruppo.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.