2010-01-26 2 views
38

Ho una vista che è stata creata con tutte le cose di default UITableView, ma ora ho bisogno di aggiungere un'area di intestazione sopra dove è lo UITableView (così lo UITableView scorrerà normalmente, ma il primo 100px dello schermo o così avrà un contenuto di intestazione statico). Non vedo dove posso ridimensionare lo UITableView in IB e non sono sicuro di come farlo.iPhone UITableView con un'area di intestazione

Qualcuno sa?

risposta

46

Perché non utilizzare l'intestazione UITableView fornita ?. Come segue:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 

{ 
    return @"My Title"; 
} 

Inoltre, è possibile ridimensionare la vista tabella in IB trascinando i bordi.

+0

Ho bisogno di inserire più dell'intestazione di testo fornita da UITableView. Sarà un'area di 100px o così alta con l'immagine di una persona sul lato sinistro e alcuni dettagli sulla destra. La vista tabella sotto l'intestazione sarà un elenco dei post della persona in un blog aziendale. Ecco perché ho bisogno di un'area di intestazione separata da UITableView. –

+0

Quindi l'approccio migliore sarebbe rendere la tabella più piccola. Assicurati che la proprietà "view" della View Controller sia una UIView effettiva e non una UITableView così puoi prima trascinare un UITableView su UIView e poi trascinare i bordi alla dimensione desiderata. –

+0

Ancora, fornendo il tuo UIView personalizzato per tableView: viewForHeaderInSection: probabilmente funzionerebbe in quel caso! –

3

È necessario incorporare lo UITableView in un UIView insieme a un'altra vista (a cui si fa riferimento come sezione dell'intestazione).

Quindi, il UIView avrà 2 subviews. La vista dell'intestazione seguita dalla vista tabella.

  • UIView (genitore)
    • UIView (intestazione)
    • UITableView (tabella)

Spero che questo aiuti.

16

Quando si aggiunge un UIView o di una delle sue sottoclassi sul UITableView utilizzando IB (basta trascinare un UIView e rilasciarlo sulla parte superiore della UITableView del tuo), si aggiunge automaticamente che UIView dei componenti e lo rende il "tableHeader" componente.

Ognuno UITableView ha un tableHeader e uno tableFooter componente riservata ...

In questo modo la nuova vista sarebbe una parte del uitable, e scorrere con esso o apparire/scomparire o qualunque cosa tu faccia al tavolo. Puoi cambiare la sua proprietà nascosta se hai bisogno di un comportamento condizionale.

D'altra parte, se si desidera che la vista di intestazione soggiorno put, come i rotoli da tavolo, allora è meglio per rendere il tavolo più piccolo e mettere l'intestazione sopra di esso come suggerito in altre risposte ...

57

È possibile utilizzare i metodi UITableViewDelegate per creare una vista di intestazione personalizzata per una tabella e specificare l'altezza, ovvero tableView:viewForHeaderInSection: e tableView:heightForHeaderInSection:. Puoi aggiungere tutto ciò che ti piace alla vista. Ecco un esempio che aggiunge un diritto allineato UILabel:

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

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)]; 

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

    headerLabel.textAlignment = NSTextAlignmentRight; 
    headerLabel.text = [titleArray objectAtIndex:section]; 
    headerLabel.backgroundColor = [UIColor clearColor]; 

    [headerView addSubview:headerLabel]; 

    return headerView; 

} 

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 

    return 30.0; 
} 
+1

in ios7, 'UITextAlignment' è deprecato, utilizzare' NSTextAlignment' invece –

+0

Grazie @indienchild - L'ho aggiornato per ARC e iOS 7. –

+1

Grazie ... !!!! –

0

mi piace la risposta da noodl_es (upvoted), perché fornisce la funzionalità e il comportamento che si desidera, ma non devi preoccuparti di ridimensionare l'UITableView: che viene gestito automaticamente. Tuttavia, la soluzione è più adatta solo se le informazioni di intestazione riguardano specificamente la prima sezione della tabella (o se la tabella ha una sola sezione). Se la tabella ha più di una sezione, l'intestazione della seconda sezione sposterà l'intestazione della prima sezione quando si scorre verso l'alto e pertanto la vista dell'intestazione non apparirà pertinente all'intera tabella.

+0

Grazie per l'upvote! Non puoi usare la variabile di sezione per specificare quale sezione (s) appare la tua intestazione personalizzata? –

+1

@noodl_es Penso che l'OP stia cercando di aggiungere una vista statica ("header") nel senso che la stessa vista dovrebbe essere visibile indipendentemente da come la tabella viene fatta scorrere. La mia comprensione è che la vista dovrebbe essere largamente indipendente dalla vista tabella, quindi sarebbe questione di aggiungere un UIView indipendente sopra UITableView. Potrei sbagliarmi, questo è molto, molto tempo fa (mi ci sono voluti 5 minuti per riconoscere ciò che avevo postato qui :-) – rene

0

Supponiamo di avere il vostro UITableViewController

@interface MXMTableViewController : UITableViewController <UITableViewDelegate,UIScrollViewDelegate> { 
/// your table view interface here 
} 

e XI ter con voi semplice UITableView ancora definito in esso, si può fare come dice Mihir override del metodo loadView in questo modo:

- (void)loadView { 

    [super loadView]; 

    UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 

    self.view = mainView; 

    [mainView release]; 

    // Add Header View 
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 36)]; 
    headerView.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:headerView]; 

    // now, move your table view down. Check you nib to choose 
    // the right Y-axis offset 
    CGRect f = tableView.frame; 
    f.origin.y += headerView.frame.size.height/2; 
    tableView.frame = f; 

    // Add the table view to the container view 
    [self.view addSubview:self.tableView]; 

    // Add footer 
    UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, self.tableView.frame.size.height, 320, 125)]; 
    footerView.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:footerView]; 
    [footerView release]; 

    [headerView release]; 

} 

.. . E questo è tutto. Hai un UITableView con intestazione e piè di pagina fissi.

PS. Ora puoi utilizzare le tue visualizzazioni personalizzate xib come viste dell'intestazione e del piè di pagina.

+0

f.origin.y + = headerView.frame.size.height/2; ? Penso che non sia diviso per due, è ** f.origin.y + = headerView.frame.size.altezza; ** – SpaceDog

0

Found a solution at iphonedevsdk

Invece di fare questo:

[tableViewController.view addSubview:viewSubclass]; 

fare questo

[tableViewController.navigationController.view addSubview:viewSubclass]; 
6

ho finalmente risolto questo problema nel modo giusto senza modificare la classe di base. L'unica risposta per aggiungere la vista al controller di navigazione padre è buona, ma le transizioni sembrano orribili.

La correzione è in realtà facile. Il trucco è creare setter e getter personalizzati per la proprietà self.tableView. Quindi, in loadView, si sostituisce la vista con un nuovo UIView e si aggiunge la tabellaView ad esso. Quindi sei libero di aggiungere sotto-visualizzazioni sul tavoloView. Ecco come si fa:

In intestazione:

@interface CustomTableViewController : UITableViewController 
{ 
    UITableView *tableView; 
} 

In .m:

- (UITableView*)tableView 
{ 
    return tableView; 
} 

- (void)setTableView:(UITableView *)newTableView 
{ 
    if (newTableView != tableView) 
    { 
     [tableView release]; 
     tableView = [newTableView retain]; 
    }   
} 

- (void)loadView { 
    [super loadView]; 
    //save current tableview, then replace view with a regular uiview 
    self.tableView = (UITableView*)self.view; 
    self.view = [[UIView alloc] initWithFrame:self.tableView.frame]; 
    [self.view addSubview:self.tableView];  

    //code below adds some custom stuff above the table 
    UIView *customHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)]; 
    customHeader.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:customHeader]; 
    [customHeader release]; 

    self.tableView.frame = CGRectMake(0, customHeader.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - customHeader.frame.size.height); 
} 

- (void)viewDidUnload 
{ 
    self.tableView = nil; 
    [super viewDidUnload]; 
} 

Enjoy!

+0

È fantastico! Grazie per questo suggerimento utile !! – SparkyNZ

+0

Questo mi disegna solo uno schermo nero su iOS 6. –