2010-11-17 10 views
16

En cada UITableViewCell de una UITableView estoy colocando una imagen en su imageView. Sin embargo, si aumento la altura de una celda utilizando tableView: heightForRowAtIndexPath: para dar cabida a más texto, me he dado cuenta que:Posicionando la imageView de una UITableViewCell

  1. La imagen está alineado al centro verticalmente.
  2. El margen izquierdo de la imagen aumenta. Esto empuja el texto hacia la derecha para que su margen izquierdo ya no esté alineado con el texto en las celdas arriba y abajo.

Me gustaría que la imagen se alinee verticalmente verticalmente, de modo que esté en la esquina superior izquierda de la celda (como la primera celda de la imagen a continuación) y no tenga su margen izquierdo aumentado (de modo que el margen izquierdo del texto en la segunda celda se alinea con el texto en la primera celda).

Alterar el marco, el centro, etc. del imageView parece no tener ningún efecto. ¿Algunas ideas? Gracias ...

(tengo una imagen del problema, pero lo que no me deja publicar una imagen aún porque soy un novato con menos de 10 reputación. Grrr ...)

Respuesta

0

Usted puede crear una celda personalizada y colocar los objetos donde los necesita, así como establecer los valores de la máscara automática.

6

En el momento en que piense que necesita ajustar los tamaños o posiciones de los elementos en los estilos predeterminados, es el momento de pensar en crear una celda personalizada con sus propios elementos dimensionados y colocados de la manera que desee. Es por eso que puede crear celdas personalizadas. :)

+0

derecho, que debe meterse con la apariencia propiedades "built-in" de la célula. – Rivera

+0

Rivera: ¿Deberías? –

45

Necesitas subclase UITableViewCell y anular layoutSubviews, de la siguiente manera:

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.imageView.frame = CGRectMake(10, 10, 50, 50); // your positioning here 
} 

En su cellForRowAtIndexPath: método, asegúrese de devolver una instancia de su nuevo tipo de célula.

+0

¿Puede explicar dónde se explica este enfoque en los documentos de Apple? Por ejemplo, ¿por qué no puedes hacer imageView.frame = CGRectMake (10,10,50,50)? (Esto no funciona, pero no puedo entender por qué no funciona. Parece que debería) – Ian

+2

No funciona porque la superclase hace el diseño en su implementación de layoutSubviews. Al llamar a [superdispositivoSubviews], la superclas colocará el imaveView y cualquier otra etiqueta/ícono, y luego podrá reposicionarlos. – TomSwift

+0

Puede ser útil comprender que una UITableViewCell es solo una UIView, que también administra y coloca estas etiquetas e imágenes de subvista para usted "de forma gratuita".Podría tomar el control de dibujar toda la celda y hacer lo que quiera (por ejemplo, rebotar alrededor de una bola). En algún punto de la curva de personalización, eso es exactamente lo que debe hacer. El tipo de subclases que sugiere Tom es un pequeño paso en ese camino. –

1

Una función realmente útil que quizás no haya intentado (en UITableViewDelegate) es tableView:willDisplayCell:forRowAtIndexPath:. Se llama inmediatamente antes de que se muestre una celda y su propósito es permitirle hacer cosas en el diseño sin el sistema operativo modificándolo de nuevo antes de la pantalla. Efectivamente tienes un control total. Lo he usado para cambiar las fuentes en las celdas, pero puedes iterar las subvistas de la celda y modificar sus cuadros también.

Aún así, estoy de acuerdo con que está en el punto en el que es hora de buscar células personalizadas y dejar de luchar contra el sistema operativo. No es difícil de hacer y Apple da un buen ejemplo en Table View Programming Guide for iOS.

+0

Intenté hacer esto pero aún así reposicioné la imagen en el medio de mi celda de vista de tabla: 'cell.imageView.frame = CGRectMake (10, 10, 50, 50);'. ¿Quizás tengas una idea de por qué? – Besi

+2

No funciona en iOS 6 – Philip007

4

Otra forma (funciona en iOS 6) es crear un UIImageView y añadirlo a la célula como un subvista

UIImageView *yourImageView = [[UIImageView alloc] initWithFrame:CGRectMake(x,y,20,20)]; 

[yourImageView setImage:[UIImage imageNamed:[imagesArray objectAtIndex:indexPath.row]]]; //You can have an Array with the name of 

[yourcell.contentView addSubview:yourImageView]; //add the imageView as a subview 
+4

No agregue vista personalizada en 'UITableViewCell' directamente. En su lugar, colóquelos bajo el objeto 'contentView'. Así es como está diseñada la clase celular. (Consulte la documentación de Apple) Si coloca la vista directamente en la celda, puede causar un resultado inesperado. – Eonil

Cuestiones relacionadas