2010-06-06 14 views
37

Soy nuevo en el desarrollo de iPhone y actualmente estoy trabajando en una aplicación de lector de RSS simple. El problema que estoy teniendo es que necesito reposicionar el textLabel dentro del UITableViewCells. He intentado setFrame o setCenter pero no hace nada. ¿Alguien sabe lo que tengo que hacer dentro del método tableView:cellForRowAtIndexPath: para reposicionar el textLabel en la parte superior de la celda (x = 0, y = 0)?iPhone UITableViewCell: reposicionando la etiqueta de texto

Gracias

PS: El UITableViewCell hace referencia a una variable llamada cell. He intentado [cell setFrame:CGRectMake(0, 0, 320, 20)] sin éxito.

Respuesta

97

Puede crear una subclase para UITableViewCell y personalizar el marco textLabel. Ver esa respuesta: Labels aligning in UITableViewCell. Funciona perfectamente para mí.

Es mi subclase

#import "UITableViewCellFixed.h" 
@implementation UITableViewCellFixed 
- (void) layoutSubviews { 
    [super layoutSubviews]; 
    self.textLabel.frame = CGRectMake(0, 0, 320, 20); 
} 
@end 

Es mi UITableViewControllerClass:

UITableViewCellFixed *cell = (UITableViewCellFixed *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCellFixed alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
+0

Funciona de manera absolutamente fantástica :) – Domness

+0

Realmente debería establecer el marco de la etiqueta en 'self.contentView.bounds' –

10

Parece que he resuelto mi propio problema. Aquí hay un código, en caso de que alguien se encuentra con el mismo problema:

UILabel *ttitle = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 20)] autorelease]; 
ttitle.font = [UIFont boldSystemFontOfSize:13]; 
ttitle.textColor = [UIColor blackColor]; 
ttitle.textAlignment = UITextAlignmentLeft; 

[ttitle setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]]; 

[cell.contentView addSubview:ttitle]; 

La idea es crear su propio objeto de etiqueta, debido a que el textLabel se posiciona automáticamente y no se puede mover alrededor.

Saludos.

+6

Esto también se rompen cuando se quita y añadir células a la mesa como la UILabel no se eliminan adecuadamente. – Domness

+0

Una forma de solucionar este problema es etiquetar las subvistas y eliminarlas después de quitar la base de la celda al iterar sobre las subvistas. Básicamente deberíamos simplemente crear subclases, la adición de subvistas en cellForRowAtIndexPath es más lenta, y más peligrosa en cuanto a la memoria – gillyD

9

El código de razón de su creador original no funciona es que parece que el marco de la textLabel se establece después de la UITableViewCell ha sido devuelto desde su método delegado.

Noté que puedo modificar con éxito muchas propiedades de la etiqueta de texto, como la alineación del texto, el color, la fuente, etc., pero alterar el marco no tiene ningún efecto y cuando imprimo el marco al depurador más tarde (como), el marco no es lo que configuro. Por lo tanto, llego a la conclusión de que el marco UIKit está alterando el marco de textLabel después de que se devuelve desde el método de delegado. Sin duda, esto se debe a que los ingenieros de Apple querían asegurarse de que su texto se dibujara en la pantalla, por lo que lo miden y alteran el marco para que encaje. Probablemente pensaron que las personas como nosotros que quisimos alterar la posición del texto podríamos hacerlo subclasificando, o simplemente agregando otro UILabel (o lo que sea) como una subvista. Un desarrollador novato puede tener un momento muy difícil si su texto no aparece en la etiqueta o se truncó porque no ajustaron el marco.

En mi caso, quería que el texto se centrara horizontalmente, que fuera un color/fuente/tamaño específico, y que fuera ligeramente vertical en la celda. Siendo demasiado perezoso para subclasificar esto, primero intenté modificar el marco. Cuando eso no funcionó, traté de buscar en Google la respuesta (encontré esta publicación).

Mi solución final fue establecer la propiedad numberOfLines en 0 y agregar algunos retornos de carro al final de mi texto. Ahora ESO es flojo.

+6

Subida de nivel debido a siendo un buen resumen del problema La solución final es horrible ;-) –

21

Puede intentar indentationLevel, separatorInset y otras propiedades de sangría de contenido de objeto UITableViewCell.

+0

Método más simple. (y) –

0

En Swift 3 sería

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.textLabel?.frame.origin.x = 50 
} 
Cuestiones relacionadas