2010-03-29 15 views
105

He estado trabajando en esto durante aproximadamente 2 días, así que pensé que comparto mis conocimientos con usted.Cómo establecer el ancho de una celda en un UITableView en estilo agrupado

La pregunta es: ¿es posible hacer que el ancho de una celda en un UITableView agrupado sea más pequeño?

La respuesta es: No.

Pero hay dos formas de obtener en torno a este problema.

Solución n. ° 1: una tabla más delgada Es posible cambiar el marco de la vista de tabla, de modo que la tabla sea más pequeña. Esto dará como resultado que UITableView represente la celda dentro con un ancho reducido.

Una solución para esto puede tener este aspecto:

-(void)viewWillAppear:(BOOL)animated 
{ 
    CGFloat tableBorderLeft = 20; 
    CGFloat tableBorderRight = 20; 

    CGRect tableRect = self.view.frame; 
    tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin 
    tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table 
    tableView.frame = tableRect; 
} 

Solución # 2: Tener células prestados por imágenes

se describe Esta solución aquí: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

Espero que esta información es útil para ti Me llevó aproximadamente 2 días probar muchas posibilidades. Esto es lo que quedó.

+3

Creo que esto debería haberse configurado como una pregunta con solo la segunda línea ("La pregunta es ..."), luego la Solución n. ° 1 y la Solución n. ° 2 publicadas como dos respuestas separadas, con una de ellos siendo aceptados. Luego, si otros usuarios agregan sus propias respuestas, y una de ellas termina siendo mejor, la respuesta aceptada se puede cambiar más adelante. – GeneralMike

Respuesta

223

Una manera mejor y más limpio para lograrlo es la subclasificación UITableViewCell y anulando su método -setFrame: así:

- (void)setFrame:(CGRect)frame { 
    frame.origin.x += inset; 
    frame.size.width -= 2 * inset; 
    [super setFrame:frame]; 
} 

Por qué es mejor? Porque los otros dos son peores.

  1. Ajustar Vista table width en -viewWillAppear:

    Primero de todo, este no es fiable, la supervista o padre controlador de vista puede ajustar tabla de vista de imagen aún más después de -viewWillAppear: se llama. Por supuesto, puede subclasificar y anular -setFrame: para su UITableView como lo hago aquí para UITableViewCells. Sin embargo, la subclasificación de UITableViewCells es una forma muy común, ligera y de Apple.

    En segundo lugar, si su UITableView tiene backgroundView, no desea que su backgroundView se reduzca al mismo tiempo. Mantener el ancho de la vista de fondo mientras se reduce el ancho de UITableView no es un trabajo trivial, sin mencionar que ampliar las subvistas más allá de su super visión no es algo muy elegante para hacer en primer lugar.

  2. personalizada prestación celular para fingir un estrecho ancho de

    Para ello, hay que preparar las imágenes especiales fondo con márgenes horizontales, y hay que subvistas disposición de las células por sí mismo para dar cabida a los márgenes. En comparación, si simplemente ajusta el ancho de la celda completa, el ajuste automático hará todos los trabajos por usted.

+2

esta es una solución agradable y elegante, lo hice en una categoría :) También me gustaría señalar que cuanto más transparentes sean los objetos, más carga de cpu :) –

+11

@misterkoz - una advertencia: algunos controles iOS (UIDatePicker para definitivo) usan internamente UITableViewCells y se rompen si implementa esto en una categoría. – Clafou

+0

¡Me estaba volviendo loca cambiar el tamaño de una tabla vista agrupada estática para adaptarse a un fondo! ¡Muchas gracias! – Claus

-6

En archivo .h añadir el delegado 'UITableViewDataSource'

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return size; 
} 
+4

Quiere establecer el ancho, no la altura –

+0

oh hoo. sry por inconveniencia. –

+0

no entiendes la pregunta y tu respuesta para la altura y sabes lo que funciona para mí porque estoy buscando la altura no por el ancho ... gracias por la respuesta – Pooja

9

Si nada funciona se puede probar este

Hacer que el color de fondo de la celda de color tan claro y luego poner una imagen de la célula con el tamaño requerido. Si desea mostrar texto en esa celda, coloque una etiqueta encima de la imagen. No se olvide de establecer el color de fondo de la etiqueta también para borrar el color.

8

Encontré que la solución aceptada no funcionó durante la rotación. Para lograr UITableViewCells con anchos fijos & márgenes flexibles acabo adaptado la solución anterior a lo siguiente:

- (void)setFrame:(CGRect)frame { 

    if (self.superview) { 
     float cellWidth = 500.0; 
     frame.origin.x = (self.superview.frame.size.width - cellWidth)/2; 
     frame.size.width = cellWidth; 
    } 

    [super setFrame:frame]; 
} 

El método se llama cuando el dispositivo gira, por lo que siempre se centra las células.

-2

lo hago en

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell; 
    CGFloat tableBorderLeft = self.view.frame.origin.x + 10; 
    CGFloat tableBorderRight = self.view.frame.size.width - 20; 

    CGRect tableRect = self.view.frame; 
    tableRect.origin.x = tableBorderLeft; 
    tableRect.size.width = tableBorderRight; 
    tableView.frame = tableRect; 
} 

Y esta trabajado para mí

11

Para hacer esto en Swift, que no proporciona métodos para establecer las variables, que tendrá que reemplazar el colocador de frame. Originalmente publicado (al menos cuando lo encontré) here

override var frame: CGRect { 
    get { 
     return super.frame 
    } 
    set (newFrame) { 
     let inset: CGFloat = 15 
     var frame = newFrame 
     frame.origin.x += inset 
     frame.size.width -= 2 * inset 
     super.frame = frame 
    } 
} 
0

Hay un método que se llama cuando se gira la pantalla: viewWillTransitionToSize

Aquí es donde se debe cambiar el tamaño del marco. Ver ejemplo. Cambia los coords de los marcos como necesites.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
     int x = 0; 
     int y = 0; 
     self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height); 
    }]; 
} 
Cuestiones relacionadas