iPhone UITableView avec une zone d’en-tête

J’ai une vue qui a été créée avec tous les éléments UITableView par défaut, mais maintenant je dois append une zone d’en-tête au-dessus de laquelle UITableView est (donc UITableView normalement, mais les 100px supérieurs de l’écran auront un en-tête statique) contenu). Je ne vois pas où je peux redimensionner UITableView dans IB et je ne sais pas comment faire.

Est-ce que quelqu’un sait?

Pourquoi n’utilisez-vous pas l’en-tête fourni par UITableView? Comme suit:

 - (NSSsortingng *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return @"My Title"; } 

De plus, vous pouvez redimensionner l’affichage de votre table dans IB en faisant glisser les bordures.

Vous pouvez utiliser les méthodes UITableViewDelegate pour créer une vue d’en-tête personnalisée pour une table et spécifier la hauteur, à savoir tableView:viewForHeaderInSection: et tableView:heightForHeaderInSection: Vous pouvez append ce que vous voulez à la vue. Voici un exemple qui ajoute une UILabel alignée à 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; } 

Lorsque vous ajoutez un UIView ou une de ses sous-classes à UITableView utilisant IB (faites simplement glisser un UIView et déposez-le sur la partie UPPER de UITableView ), il ajoute automatiquement ce composant UIView et en fait le composant “tableHeader”.

Chaque UITableView a un tableHeader et un composant tableFooter réservés …

De cette façon, la nouvelle vue ferait partie de l’UITable et défilerait avec elle ou apparaitrait / disparaitrait ou ce que vous feriez sur la table. Vous pouvez modifier sa propriété masquée si vous avez besoin d’un comportement conditionnel.

D’un autre côté, si vous souhaitez que la vue d’en-tête rest en place, au fur et à mesure que la table défile, il est préférable de réduire la taille du tableau et de placer l’en-tête comme suggéré dans d’autres réponses …

J’ai finalement résolu ce problème de la bonne façon sans changer la classe de base. La seule réponse pour append la vue au contrôleur de navigation parent est intéressante, mais les transitions sont horribles.

Le correctif est en fait facile. L’astuce consiste à créer un setter et un getter personnalisés pour la propriété self.tableView. Ensuite, dans loadView, vous remplacez la vue par une nouvelle UIView et y ajoutez la tableView. Ensuite, vous êtes libre d’append des sous-vues autour de la tableView. Voici comment ça se passe:

En en-tête:

 @interface CustomTableViewController : UITableViewController { UITableView *tableView; } 

Dans 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]; } 

Prendre plaisir!

Vous devrez incorporer UITableView dans un UIView avec une autre vue (que vous UIView section en-tête).

Ainsi, l’ UIView aura 2 sous-vues. La vue d’en-tête suivie de la vue table.

  • UIView (parent)
    • UIView (en-tête)
    • UITableView (table)

J’espère que cela t’aides.

J’aime la réponse de noodl_es (votée), car elle fournit les fonctionnalités et le comportement que vous souhaitez, mais vous n’avez pas à vous soucier de redimensionner UITableView: cela est géré automatiquement pour vous. Cependant, la solution ne convient que si les informations d’en-tête se rapportent spécifiquement à la première section de la table (ou si la table ne comporte qu’une seule section). Si la table a plus d’une section, alors l’en-tête de la deuxième section repoussera l’en-tête de la première section lorsqu’elle défile vers le haut. Par conséquent, la vue d’en-tête n’apparaîtra pas comme appartenant à la table entière.

Trouvé une solution à iphonedevsdk

Au lieu de faire ceci:

 [tableViewController.view addSubview:viewSubclass]; 

fais ça

 [tableViewController.navigationController.view addSubview:viewSubclass]; 

Supposons que votre UITableViewController

 @interface MXMTableViewController : UITableViewController  { /// your table view interface here } 

et un xib avec vous UITableView simple défini encore, vous pouvez faire comme Mihir dit loadView méthode loadView comme ceci:

 - (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]; } 

…et c’est tout. Vous avez un UITableView avec un en-tête et un pied de page fixes.

PS Vous pouvez maintenant utiliser vos vues personnalisées xib comme vues d’en-tête et de pied de page.