uitableviewcontroller tutorial example iphone ios objective-c uitableview

iphone - tutorial - uitableviewcontroller



¿Cómo animar el cambio de altura de un encabezado de sección en UITableView? (4)

Esto funciona:

flatHeader = YES; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; [[self tableView] beginUpdates]; [[self tableView] endUpdates]; CGRect frame = [[self headerView] frame]; frame.size.height = [self tableView:[self tableView] heightForHeaderInSection:0]; [[self headerView] setFrame:frame]; [UIView commitAnimations];

He implementado este método para devolver la altura del encabezado de la sección. Sin embargo, cuando la altura de la sección cambia, ocurre inmediatamente sin animación.

¿Hay una animación para eso?

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if (flatHeader) { return 50.0f; } else { return 100.0f; } }


Mi solución en Swift:

class MyTableViewController: UITableViewController { var sectionHeaderView:UIView?

...

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { sectionHeaderView = UIView(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 30)) sectionHeaderView?.backgroundColor = UIColor.grayColor() var button = UIButton(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 30)) button.backgroundColor = UIColor.darkGrayColor() button.setTitle("collapse/expand", forState: .Normal) button.addTarget(self, action: "collapseOrExpandSectionHeader", forControlEvents: .TouchUpInside) sectionHeaderView?.addSubview(button) return sectionHeaderView }

...

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if let sectionHeader = sectionHeaderView { return view.frame.size.height } else { return 30.0 } }

...

func collapseOrExpandSectionHeader() { if let sectionHeader = sectionHeaderView { let headerHeight:CGFloat if sectionHeader.frame.size.height == 200 { headerHeight = 30.0 } else { headerHeight = 200.0 } UIView.animateWithDuration(0.3, animations: { self.tableView?.beginUpdates() sectionHeader.frame.size.height = headerHeight self.tableView?.endUpdates() } ) } }


No estoy 100% seguro de que esto funcione para un encabezado de tabla, pero funciona para filas de tablas, así que vale la pena intentarlo. Tengo una variable de instancia headerHeight inicialmente establecida en 44.0 y la cambio como tal:

- (void)changeHeight { [self.tableView beginUpdates]; headerHeight = 88.0; [self.tableView endUpdates]; }

En mi código, devuelvo el headerHeight en heightForRowAtIndexPath pero puedes intentarlo en heightForHeaderInSection :

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return headerHeight; }


No he probado esto, pero a veces obtengo animaciones no deseadas cuando mi UITableViewCells cambia de altura. La causa de esto es que dibujo mis propias celdas, y uso CALayers para hacerlo. En las (void)layoutSubviews , cambiaría el tamaño de mi CALayer para que sea el tamaño del marco de la celda.

myLayer.frame = self.bounds;

Cuando la propiedad de marco / límites de un CALayer cambia, se anima. Entonces, en teoría, diría que se podría usar el método tableView: viewForHeaderInSection: que le permitiría dibujar su propio encabezado de sección. Simplemente podría devolver una UIView que implemente (void)layoutSubviews y luego en ese método hacer

self.layer.frame = self.bounds;

Solo una idea.