2010-07-20 12 views
19

OK, sé que esto se ha pedido previamente, así que por favor, perdónenme por preguntar nuevamente. Simplemente parece que tiene que haber una manera más fácil de hacer esto.Cambiando el color de los encabezados de sección de UITableView

¿Existe una manera "simple" de cambiar el color de fondo del encabezado de la sección UITableView? Sé que puedo usar el método delegado 'viewForHeaderInSection' para entregarle a UITableView una UIView personalizada para usar en los encabezados de las secciones, pero todo lo que realmente quiero hacer es establecer 'tintColor'. Hay una propiedad tintColor en la barra de búsqueda, ¿por qué no para los encabezados de las secciones?

Si utilizo viewForHeaderInSection para crear mi propia UIView personalizada, también tengo que crear mi propia etiqueta. Tengo que diseñar y posicionar mi etiqueta para que se vea como el resto del estándar de Apple. Tengo que diseñar y clasificar el 'fondo' para que se vea como el resto del estándar de Apple.

No encuentro la manera de pedir simplemente el encabezado de sección y luego cambiar el color. Me estoy perdiendo algo o realmente tengo que hacer esto de la manera difícil.

Si tengo que hacer esto de la manera difícil, ¿alguien tiene toda la información de estilo que coincida con el estándar de Apple? - bar es 'translúcido' - bar tiene algo de sombreado en la parte superior y la parte inferior - etiqueta tiene un cierto tamaño, posición, matices, etc

Gracias. Y una vez más, perdón por hacer esta pregunta nuevamente.

Respuesta

12

Esto es algo que he pasado bastante tiempo lidiando conmigo mismo, solo para descubrir que no hay forma de simplemente cambiar el tintColor del encabezado de sección. La solución que se me ocurrió fue capturar el fondo del encabezado de la sección, cambiar el tinte en Photoshop y luego usarlo como fondo del encabezado de la sección. Entonces es solo un caso de diseñar la etiqueta.

Como dijiste, lo que debes usar es el método de delegado viewForHeaderInSection.

Esto es lo que he encontrado obras y se ve como el valor por defecto de Apple:

UIView *customView = [[[UIView alloc] initWithFrame:CGRectMake(10.0, 0.0, 320.0, 22.0)] autorelease]; 
customView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"headerbackground.png"]];; 

UILabel *headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease]; 
headerLabel.backgroundColor = [UIColor clearColor]; 
headerLabel.opaque = NO; 
headerLabel.textColor = [UIColor whiteColor]; 
headerLabel.font = [UIFont boldSystemFontOfSize:18]; 
headerLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); 
headerLabel.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]; 
headerLabel.frame = CGRectMake(11,-11, 320.0, 44.0); 
headerLabel.textAlignment = UITextAlignmentLeft; 
headerLabel.text = @"Header Label"; 
[customView addSubview:headerLabel]; 
return customView; 

aquí "headerbackground.png" es un 1 píxel por píxel 22 (el doble que el iPhone 4 para) la imagen que se obtendrá repetido a lo largo del encabezado.

Espero que esto ayude!

+0

¿Por qué duplicar eso para iPhone 4? ¿Puedes dar una referencia para esa información? – Anand

+1

¿Porque el iPhone 4 tiene el doble de resolución? Entonces en ese ejemplo "headerbackground.png" sería 1x22, y también tendría otra imagen llamada "[email protected]" que se usaría en el iPhone 4 (y ahora el nuevo iPod touch). Para obtener más información, lea aquí: http: //developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/SupportingResolutionIndependence/SupportingResolutionIndependence.html – neilkimmett

+0

Hacer mis propias capturas de pantalla indica que el recuadro izquierdo apropiado para el texto es 12 píxeles, no 10. Al igual que: CGFloat leftInset = 12.0f; UILabel * label = [[UILabel alloc] initWithFrame: CGRectMake (leftInset, 0, tableSize.width - leftInset, headerImg.size.height)]; – MoDJ

29

Con la nueva forma UIAppearance de hacer las cosas, en las versiones> iOS 6.0 que sólo se puede hacer, por ejemplo:

[[UITableViewHeaderFooterView appearance] setTintColor:[UIColor redColor]]; 
+1

donde tengo que poner esto? – Ulaga

+0

Parece que no tiene ningún efecto en iOS 10 – elsurudo

19

Con UIAppearance puede cambiar UILabel color del texto en sus UITableView encabezados de la siguiente manera:

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setTextColor:[UIColor whiteColor]]; 
[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setShadowColor:[UIColor whiteColor]]; 

Debería funcionar en iOS 6.0+. Se puede llamar a cualquier parte (viewDidLoad, etc.).

+1

[UITableViewHeaderFooterView class] debería devolver nada hasta iOS 6.0, por lo que este método no debería funcionar hasta 6.0 – Speakus

+0

Gracias, corregí mi respuesta. – user882209

7

Si cambia la apariencia, como en las otras respuestas, es toda la aplicación. Si desea cambiar sólo por un tableview específica, implementar:

-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { 
    UITableViewHeaderFooterView * headerview = (UITableViewHeaderFooterView *)view; 
    headerview.contentView.backgroundColor = [UIColor greenColor]; 
    headerview.textLabel.textColor = [UIColor whiteColor]; 
} 
2

El método UIAppearance appearanceWhenContainedIn ha dejado de utilizarse a partir del 9 de iOS.0; en su lugar, aún puede hacer exactamente lo mismo con el método de aparienciaContenidoInstanciasdeclases y una matriz.

[UILabel appearanceWhenContainedInInstancesOfClasses:@[[UITableViewHeaderFooterView class]]].textColor = [UIColor darkTextColor]; 
Cuestiones relacionadas