Aggiunta di iOS UITableView HeaderView (non intestazione di sezione)


167

Voglio aggiungere un'intestazione di tabella (non le intestazioni di sezione) come nell'app dei contatti, ad esempio: inserisci qui la descrizione dell'immagine

esattamente così - un'etichetta accanto a un'immagine sopra il tavolo.

Voglio che tutte le viste siano scorrevoli in modo da non poterle posizionare al di fuori del tavolo.

Come lo posso fare?

Risposte:


245

UITableViewha una tableHeaderViewproprietà. Impostalo sulla vista che vuoi lassù.

Usa un nuovo UIViewcome contenitore, aggiungi un'etichetta di testo e una vista immagine a quella nuova UIView, quindi imposta tableHeaderViewla nuova vista.

Ad esempio, in a UITableViewController:

-(void)viewDidLoad
{
     // ...
     UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:imageView];
     UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:labelView];
     self.tableView.tableHeaderView = headerView;
     [imageView release];
     [labelView release];
     [headerView release];
     // ...
} 

Grande! Grazie sta funzionando. Esiste una proprietà per far crescere le celle di tableview grandi quanto il testo all'interno?
Assaf b

Per fare ciò, devi essere in grado di calcolare l'altezza della cella data una stringa e passare quel valore per heightForRowAtIndexPath. È possibile utilizzare il metodo NSString sizeWithFont: boundinedToSize: funzione per capire l'altezza del testo quando vincolato a una dimensione.
Segna

Aggiungilo dopo il layout, altrimenti le dimensioni non saranno quelle che desideri. E viewDidLoad è un buon posto.
BollMose,

È buona norma impostare la geometria della vista durante la fase viewDidLoad?
Nandish A

1
ok se imposti la vista dell'intestazione nella sorgente delle tabelle sembra funzionare, assicurati di impostare anche l'altezza: esempio:public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
panthor314

193

Puoi farlo abbastanza facilmente in Interface Builder. Basta creare una vista con una tabella e rilasciare un'altra vista sulla tabella. Questa diventerà la vista dell'intestazione della tabella. Aggiungi le etichette e l'immagine a quella vista. Vedi l'immagine qui sotto per la gerarchia della vista. Visualizza la gerarchia in Interface Builder


12
Preferisco questa risposta dal momento che scrivo il codice quando posso ordinarlo e posizionarlo in IB
Besi,

1
fantastico grazie per il suggerimento. A proposito, non hai bisogno di una vista di scorrimento nell'intestazione nel caso in cui qualcun altro si stesse chiedendo o provando quello. Utilizza la ScrollView di UITableView per la tua intestazione, poiché la testata è tecnicamente una parte di UITableView
Rob R.

2
Vale la pena di menzionare come funziona in storyboard editor ora: stackoverflow.com/q/7841167/926907
Dmitry Zaytsev

Non usare un pennino per questo. Richiede più tempo per caricare. Scrivilo nel codice. Per la riusabilità, crea una classe personalizzata e crea un'istanza ...
Charles Robertson,

1
Non mi consente di aggiungere un vincolo di altezza alla vista dell'intestazione.
Ian Warburton,

14

In Swift :

override func viewDidLoad() {
    super.viewDidLoad()

    // We set the table view header.
    let cellTableViewHeader = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewHeaderCustomCellIdentifier) as! UITableViewCell
    cellTableViewHeader.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewHeaderCustomCellIdentifier]!)
    self.tableView.tableHeaderView = cellTableViewHeader

    // We set the table view footer, just know that it will also remove extra cells from tableview.
    let cellTableViewFooter = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewFooterCustomCellIdentifier) as! UITableViewCell
    cellTableViewFooter.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewFooterCustomCellIdentifier]!)
    self.tableView.tableFooterView = cellTableViewFooter
}

L'uso di questo approccio per iOS 7 o versioni successive attiverà un avviso di runtime: "nessun percorso di indice per la cella della tabella viene riutilizzato". Per evitare questo errore, link di
baskInEminence

11

Puoi anche semplicemente creare SOLO un UIView nel generatore di interfacce e trascinare ImageView e UILabel (per farlo sembrare l'intestazione desiderata) e quindi usarlo.

Una volta che UIView assomiglia anche a quello che desideri, puoi inizializzarlo a livello di codice da XIB e aggiungerlo a UITableView. In altre parole, non è necessario progettare la tabella INTERA in IB. Solo headerView (in questo modo la vista header può essere riutilizzata anche in altre tabelle)

Ad esempio, ho una UIView personalizzata per una delle intestazioni della mia tabella. La vista è gestita da un file xib chiamato "CustomHeaderView" e viene caricata nell'intestazione della tabella usando il seguente codice nella mia sottoclasse UITableViewController:

-(UIView *) customHeaderView {
    if (!customHeaderView) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomHeaderView" owner:self options:nil];
    }

    return customHeaderView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set the CustomerHeaderView as the tables header view 
    self.tableView.tableHeaderView = self.customHeaderView;
}

-36
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)];
    headerView.backgroundColor=[[UIColor redColor]colorWithAlphaComponent:0.5f];
    headerView.layer.borderColor=[UIColor blackColor].CGColor;
    headerView.layer.borderWidth=1.0f;

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5,100,20)];

    headerLabel.textAlignment = NSTextAlignmentRight;
    headerLabel.text = @"LeadCode ";
    //headerLabel.textColor=[UIColor whiteColor];
    headerLabel.backgroundColor = [UIColor clearColor];


    [headerView addSubview:headerLabel];

    UILabel *headerLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, headerView.frame.size.width-120.0, headerView.frame.size.height)];

    headerLabel1.textAlignment = NSTextAlignmentRight;
    headerLabel1.text = @"LeadName";
    headerLabel.textColor=[UIColor whiteColor];
    headerLabel1.backgroundColor = [UIColor clearColor];

    [headerView addSubview:headerLabel1];

    return headerView;

}

Non hai capito la tua domanda?
Priyam

2
Questo è sbagliato. Vuole solo una singola intestazione di tabella NON un'intestazione di sezione. Le due cose sono molto diverse. Si prega di leggere la domanda.
Charles Robertson,
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.