objective-c uitableview header capitalization

objective c - UITableView titleForHeaderInSection muestra todas las mayúsculas



objective-c capitalization (13)

Además de la publicación de @ Animal451. Para swift 3 puedes usar

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { guard section == 0 , let tableViewHeaderFooterView = view as? UITableViewHeaderFooterView else { return } tableViewHeaderFooterView.textLabel?.text = "Your awesome string" }

Y luego ignorar - titleForHeaderInSection:

Tenga en cuenta que este código es solo para la primera sección. Si desea revisar todas sus secciones, deberá agregar soporte para ellas

Estoy usando titleForHeaderInSection para mostrar un encabezado para una sección UITableView. Funcionó bien con el iOS6 SDK, pero el iOS7 SDK muestra el encabezado en todos los CAPS.

Supongo que es parte de las Pautas de interfaz humana actualizadas de Apple; todos los ejemplos allí muestran encabezados en mayúsculas. Además, todos los encabezados de sección en Configuración en mi iPhone están en mayúsculas.

Sin embargo, me pregunto si hay una forma de evitar eso. Normalmente, no me importaría mostrar límites si eso mejora la coherencia, pero cuando necesito mostrar los nombres de las personas en un encabezado de sección, es un poco incómodo.

¿Alguien tiene idea de cómo moverse a la capitalización?


Con RubyMotion / RedPotion, pegue esto en su TableScreen:

def tableView(_, willDisplayHeaderView: view, forSection: section) view.textLabel.text = self.tableView(_, titleForHeaderInSection: section) end

Creo que lo que sucede es que en algún lugar el texto se establece en TODOS LOS MAYÚSCULAS. Este pequeño truco REINICIALIZA el texto a lo que era originalmente. ¡Funciona como un encanto para mí!


En Swift ,

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { let headerView = view as! UITableViewHeaderFooterView headerView.textLabel.text = "My_String" }


Gracias @ Animal451. Esta es una solución más genérica que funcionaría con cualquier tipo de cadena de encabezado.

// We need to return the actual text so the header height gets correctly calculated - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return self.headerString; } - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view; [header.textLabel setText:self.headerString]; //String in the header becomes uppercase. Workaround to avoid that. }

Para evitar la duplicación, la cadena de encabezado se puede declarar en cualquier otro lugar. Lo he hecho en el método -viewDidLoad.


La solución que encontré es agregar título en el método "titleForHeaderInSection"

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

y luego llama al método willDisplayHeaderView para actualizar:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view; header.textLabel.textColor = [UIColor darkGrayColor]; header.textLabel.font = [UIFont boldSystemFontOfSize:18]; CGRect headerFrame = header.frame; header.textLabel.frame = headerFrame; header.textLabel.text= @"Table Title"; header.textLabel.textAlignment = NSTextAlignmentLeft; }


La solución que funcionó para mí fue crear una simple variable de instancia UILabel para usar como vista de encabezado de sección. (Sus necesidades pueden ser diferentes, pero para mí, solo necesitaba tener texto en mi encabezado ...) Luego, dentro de viewForHeaderInSection , configuro la etiqueta según sea necesario y devuelvo esta etiqueta como vista de encabezado.

Luego, cada vez que quiero actualizar el texto en el encabezado, simplemente cambio el texto de la etiqueta directamente.

En el archivo .h:

@property (nonatomic, retain) UILabel *sectionHeaderLabel;

luego en el archivo .m:

- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { return [self refreshMySectionHeaderLabel]; // I created this handy little method to update the header text } // Get the latest text for the section header... -(UILabel *) refreshMySectionHeaderLabel { // Initialise the first time. if( sectionHeaderLabel == nil ) { sectionHeaderLabel = [[UILabel alloc] initWithFrame: CGRectNull]; } // ... // May also set other attributes here (e.g. colour, font, etc...) // Figure out the text... sectionHeaderLabel.text = @"Your updated text here..."; return sectionHeaderLabel; }

Cuando quiero actualizar mi encabezado de sección, simplemente llamo a:

[self refreshMySectionHeaderLabel];

... o simplemente puedes llamar:

sectionHeaderLabel.text = @"The new text...";

Tome nota: solo tengo 1 sección (sección 0). Es posible que deba contabilizar varias secciones ...


Sí, teníamos un problema similar a esto, y mi propia solución fue la siguiente:

La documentación de Apple UITableViewHeaderFooterView (el enlace es irritantemente largo pero puede encontrarla fácilmente con su motor de búsqueda favorito) dice que puede acceder al texto Label de la vista de encabezado sin tener que formatear su propia vista mediante el método viewForHeaderInSection.

textLabel Una etiqueta de texto principal para la vista. (solo lectura)

@property (nonatomic, readonly, retain) UILabel * textLabel Discussion Al acceder al valor en esta propiedad, la vista crea una etiqueta predeterminada para mostrar una cadena de texto de detalle. Si administra el contenido de la vista usted mismo al agregar subvistas a la propiedad contentView, no debe acceder a esta propiedad.

La etiqueta se dimensiona para adaptarse al área de visualización de contenido de la mejor manera posible en función del tamaño de la cadena. Su tamaño también se ajusta dependiendo de si hay una etiqueta de texto detallada presente.

Con algunas búsquedas adicionales, el mejor lugar para modificar el texto de la etiqueta fue el método willDisplayHeaderView (sugerido en Cómo implementar `viewForHeaderInSection` en el estilo iOS7? ).

Entonces, la solución que se me ocurrió es bastante simple y solo hace una transformación de la cadena de etiquetas de texto, después de que en realidad fue establecida por titleForHeaderInSection:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { //I have a static list of section titles in SECTION_ARRAY for reference. //Obviously your own section title code handles things differently to me. return [SECTION_ARRAY objectAtIndex:section]; }

y luego simplemente llame al método willDisplayHeaderView para modificar su apariencia:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { if([view isKindOfClass:[UITableViewHeaderFooterView class]]){ UITableViewHeaderFooterView *tableViewHeaderFooterView = (UITableViewHeaderFooterView *) view; tableViewHeaderFooterView.textLabel.text = [tableViewHeaderFooterView.textLabel.text capitalizedString]; } }

Puede colocar sus propias cláusulas ''if'' o ''switch'' allí ya que el número de sección también se pasa al método, así que con suerte le permitirá mostrar su nombre de usuario / cliente en letras mayúsculas de manera selectiva.

Ben.

__

Dejé de poner sigs divertidos en SO ''porque yo era el único que los encontraba divertidos.


Si quieres mantener la cadena tal como está, simplemente puedes hacer esto:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { if ([view isKindOfClass:[UITableViewHeaderFooterView class]] && [self respondsToSelector:@selector(tableView:titleForHeaderInSection:)]) { UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view; headerView.textLabel.text = [self tableView:tableView titleForHeaderInSection:section]; } }


Swift 3.x:

if let headerView = view as? UITableViewHeaderFooterView { headerView.textLabel?.text? = headerView.textLabel?.text?.capitalized ?? "" }


Una solución de línea, basada en @Dheeraj D respuesta:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { (view as? UITableViewHeaderFooterView)?.textLabel?.text = (view as? UITableViewHeaderFooterView)?.textLabel?.text?.capitalized }


Una solución que encontré es utilizar UITableViewHeaderFooterView .

En lugar de

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return @"some title"; }

Hacer

- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { static NSString *identifier = @"defaultHeader"; UITableViewHeaderFooterView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:identifier]; if (!headerView) { headerView = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:identifier]; } headerView.textLabel.text = @"some title"; return headerView; }

Lo malo es que la vista de tabla ya no ajustará automáticamente la altura del encabezado de la sección. Entonces, si la altura de su encabezado varía, tendrá que hacer algo como esto:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { id headerAppearance = [UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil]; UIFont *font = [headerAppearance font]; CGFloat viewWidth = CGRectGetWidth(tableView.frame); CGFloat xInset = 10; CGFloat yInset = 5; CGFloat labelWidth = viewWidth - xInset * 2; CGSize size = [sectionInfo.name sizeWithFont:font constrainedToSize:CGSizeMake(labelWidth, MAXFLOAT)]; return size.height + yInset * 2; }

Realmente no me gusta la información de diseño de codificación (el recuadro) de esta manera, ya que podría romperse en la versión futura. Si alguien tiene una mejor solución para obtener / establecer la altura del encabezado, soy todo oídos.


RÁPIDO

En la implementación, descubrí que necesita especificar el texto del encabezado de sección en las funciones titleForHeaderInSection y willDisplayHeaderView , y también en ocultar el encabezado.

extension ViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { let sectionHeader = datasource[section].sectionHeader // Header Title return sectionHeader } func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { guard let header = view as? UITableViewHeaderFooterView else { return } header.textLabel?.textColor = UIColor.darkGray header.textLabel?.font = UIFont.systemFont(ofSize: 20, weight: .semibold) header.textLabel?.frame = header.frame // Header Title header.textLabel?.text = datasource[section].sectionHeader } }


La solución más simple para estaba abajo: Swift 2.x

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { header.textLabel?.text = header.textLabel?.text?.capitalizedString }