iOS7 – Texto multilínea en el encabezado de TableView?

Estoy intentando actualizar el código en una de mis aplicaciones para iOS7 y lo estoy transfiriendo al uso de Storyboards. Me he topado con un problema al tratar de get un encabezado de vista de tabla para mostrar más de una línea de text (las celdas de vista de tabla siguen funcionando bien).

El TableView se creó usando el Storyboard, pero estoy usando la celda personalizada del progtwig anterior en lugar de crear una nueva celda personalizada en el Storyboard.

Mi código que solía funcionar bien:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { switch (section) { case 0: return [NSString stringWithFormat:@"Fixture Counts per \nTable 2902.1 - %@ IBC\n\n Occupancy Recap", strCodeYear ]; //(rounded up) break; case 1: return [NSString stringWithFormat:@"Womens Fixtures"]; break; case 2: return [NSString stringWithFormat:@"Mens Fixtures"]; break; case 3: return [NSString stringWithFormat:@"General Fixtures"]; break; } // To avoid "control reaches end of non-void function" return 0; } 

El \ n solía ser suficiente para que el encabezado se expandiera con las líneas de text. Puedo decir que \ n todavía está activando un retorno, pero solo una línea de text es visible.

He cambiado el tamaño del encabezado para asegurarme de que haya suficiente espacio, pero aún solo una línea de text:

 // Set Custom Heights for Headers -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ if(section == 0 ) return 200.0f; else return 60.0f; // put 22 in case of plain one.. } 

Intenté encontrar una forma de utilizar numberOfLines como para una label, pero sin éxito. Miré la Referencia de Clase UITableView y no vi nada que hiciera reference al número de líneas, pero intenté de todos modos:

 - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UILabel *label = [[UILabel alloc] init]; label.numberOfLines = 2; return 0; // nil 0 view section } 

Cualquier ayuda es apreciada.

Así es como lo hago, obtuve este resultado de encabezado de tabla de varias líneas:

Resultado

Cabecera de tabla multilínea

Código fuente

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.dataSource = @[@"apple", @"banana", @"orange", @"grapes", @"watermelon"]; self.sectionNames = @[ @"Fixture Counts per \nTable 2902.1 - 2014 IBC\n\n Occupancy Recap", @"Women Fixtures", @"Mens Fixture", @"General Fixtures", ]; UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.frame]; tableView.delegate = self; tableView.dataSource = self; [self.view addSubview:tableView]; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return self.sectionNames.count; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if(section == 0) { return self.dataSource.count; } else { return 0; } } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"cellID"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if(cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; } cell.textLabel.text = [self.dataSource objectAtIndex:indexPath.row]; return cell; } -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { // calculate height of UILabel UILabel *lblSectionName = [[UILabel alloc] init]; lblSectionName.text = [self.sectionNames objectAtIndex:section]; lblSectionName.textColor = [UIColor lightGrayColor]; lblSectionName.numberOfLines = 0; lblSectionName.lineBreakMode = NSLineBreakByWordWrapping; lblSectionName.backgroundColor = [UIColor grayColor]; [lblSectionName sizeToFit]; return lblSectionName.frame.size.height; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { // calculate height of UILabel UILabel *lblSectionName = [[UILabel alloc] init]; lblSectionName.text = [self.sectionNames objectAtIndex:section]; lblSectionName.textColor = [UIColor lightGrayColor]; lblSectionName.numberOfLines = 0; lblSectionName.lineBreakMode = NSLineBreakByWordWrapping; lblSectionName.backgroundColor = [UIColor grayColor]; [lblSectionName sizeToFit]; return lblSectionName; } 

En caso de que alguien tenga un problema similar, aquí está mi código para la porción de tableview del código, completa con la sección que comenté:

 #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 4; } // Set Custom Heights for Headers -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ if(section == 0 ) return 100.0f; else return 60.0f; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch (section) { case 0: // Recap return 2; break; case 1: // Womens return 5; break; case 2: // Mens return 5; break; case 3: // General return 6; break; } return 0; } // ^.^ Customize the section title // - /* - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { switch (section) { case 0: return [NSString stringWithFormat:@"Fixture Counts (rounded up) per \nTable 2902.1 - %@ IBC\n\n Occupancy Recap", strCodeYear ]; break; case 1: return [NSString stringWithFormat:@"Womens Fixtures"]; break; case 2: return [NSString stringWithFormat:@"Mens Fixtures"]; break; case 3: return [NSString stringWithFormat:@"General Fixtures"]; break; } // To avoid "control reaches end of non-void function" return 0; } */ - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { // calculate height of UILabel UILabel *lblSectionName = [[UILabel alloc] init]; // lblSectionName.textColor = [UIColor lightGrayColor]; lblSectionName.numberOfLines = 0; lblSectionName.lineBreakMode = NSLineBreakByWordWrapping; lblSectionName.backgroundColor = [UIColor colorWithRed:245.0f/255.0f green:245.0f/255.0f blue:245.0f/255.0f alpha:0.9f]; // lblSectionName.text switch (section) { case 0: lblSectionName.text = [NSString stringWithFormat:@"Fixture Counts (rounded up) per \nTable 2902.1 - %@ IBC\n\n Occupancy Recap", strCodeYear ]; break; case 1: lblSectionName.text = [NSString stringWithFormat:@"Womens Fixtures"]; break; case 2: lblSectionName.text = [NSString stringWithFormat:@"Mens Fixtures"]; break; case 3: lblSectionName.text = [NSString stringWithFormat:@"General Fixtures"]; break; } [lblSectionName sizeToFit]; return lblSectionName; } // ^.^ Customize the appearance of table view cells. // - - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; // ^.^ Utilize the CustomCell class // - static NSString *CustomCellIdentifier = @"CustomCellIdentifier"; CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; for (id oneObject in nib) if ([oneObject isKindOfClass:[CustomCell class]]) cell = (CustomCell *)oneObject; } // Identify Section and Row NSUInteger section = [indexPath section]; NSUInteger row = [indexPath row]; // Sets the number of lines in the cell to be a variable cell.titleLabel.numberOfLines = 0; switch (section) { case 0: cell.titleLabel.text = [titleFixOccupancyArray objectAtIndex:row]; cell.dataLabel.text = [dataFixOccupancyArray objectAtIndex:row]; cell.warningLabel.text = [warningFixOccupancyArray objectAtIndex:row]; break; case 1: cell.titleLabel.text = [titleWomensArray objectAtIndex:row]; cell.dataLabel.text = [dataWomensArray objectAtIndex:row]; cell.warningLabel.text = [warningWomensArray objectAtIndex:row]; break; case 2: cell.titleLabel.text = [titleMensArray objectAtIndex:row]; cell.dataLabel.text = [dataMensArray objectAtIndex:row]; cell.warningLabel.text = [warningMensArray objectAtIndex:row]; break; case 3: cell.titleLabel.text = [titleFixturesArray objectAtIndex:row]; cell.dataLabel.text = [dataFixturesArray objectAtIndex:row]; cell.warningLabel.text = [warningFixturesArray objectAtIndex:row]; break; } return cell; } 

Siguiendo a @Zhang, prefiero usar NSString boundRectWithSize para calcular la altura del encabezado:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { // create a custom multi-line label UILabel *label = [[UILabel alloc] init]; label.text = self.headerText; label.numberOfLines = 0; label.textAlignment = NSTextAlignmentCenter; label.lineBreakMode = NSLineBreakByWordWrapping; label.font = self.headerFont; [label sizeToFit]; return label; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { // compute size NSString *text = self.headerText CGRect rect = [text boundingRectWithSize:CGSizeMake(CGRectGetWidth(tableView.frame), CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.headerFont} context:nil]; return MAX(CGRectGetHeight(rect), 44); // keep height no smaller than Plain cells }