Cómo establecer el ancho de una celda en una UITableView en estilo agrupado

He estado trabajando en esto durante aproximadamente 2 días, así que pensé en compartir mis conocimientos contigo.

La pregunta es: ¿es posible reducir el ancho de una celda en un UITableView agrupado?

La respuesta es no.

Pero hay dos formas de evitar 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 verse así:

-(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 representadas por imágenes

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

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

Una forma mejor y más limpia de lograr esto es subclasificar UITableViewCell y anular su método -setFrame: como este:

 - (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. Ajuste el ancho de la vista de tabla en -viewWillAppear:

    En primer lugar, esto no es confiable, la supervista o el controlador de vista principal pueden ajustar el marco de la vista de tabla más después de que se -viewWillAppear: . Por supuesto, puede subclasificar y anular -setFrame: para su UITableView como lo que 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. Representación de celda personalizada para falsificar un ancho más estrecho

    Para hacer esto, debe preparar imágenes de fondo especiales con márgenes horizontales, y usted tiene que diseñar subvistas de celdas usted mismo para acomodar 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.

Para hacer esto en Swift, que no proporciona métodos para establecer variables, tendrá que anular el setter para el frame . Originalmente publicado (al menos donde lo encontré) aquí

 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 } } 

Si nada funciona, puedes intentar esto

Haga que el color de fondo de la celda sea de color claro y luego coloque una imagen de la celda 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.

Encontré que la solución aceptada no funcionó en la rotación. Para lograr UITableViewCells con anchos fijos y márgenes flexibles, acabo de adaptar 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 cada vez que el dispositivo gira, por lo que las células siempre estarán centradas.

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

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

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

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 esto funcionó para mí

En el archivo .h agregue el delegado ‘UITableViewDataSource’

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