TableView expandible en el iphone

enter image description here

Quiero hacer este tipo de vista de tabla expandible / plegable . hay categorías y subcategorías como en la imagen. por ejemplo, “salud y belleza” es una categoría y cuando hago clic en esta celda, aparecen sus subcategorías como en la imagen a continuación. Entonces, ¿cómo puedo hacer este tipo de vista de tabla? por favor sugiérame.

Finalmente recibo dos enlaces de ayuda muy útiles a continuación, que describen exactamente cuál es el requisito aquí Expandir / Contraer Secciones de TableView
Vista de tabla plegable para iOS

Realmente, buenos artículos para este tipo de secciones de tableview expandibles / colapsadas

Utilice el siguiente código para Cell expansible en UITableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } cell.textLabel.text=[[self.arForTable objectAtIndex:indexPath.row] valueForKey:@"name"]; [cell setIndentationLevel:[[[self.arForTable objectAtIndex:indexPath.row] valueForKey:@"level"] intValue]]; return cell; } 

código para expandir y contraer filas – TableView DidSelectRow Method

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; NSDictionary *d=[self.arForTable objectAtIndex:indexPath.row]; if([d valueForKey:@"Objects"]) { NSArray *ar=[d valueForKey:@"Objects"]; BOOL isAlreadyInserted=NO; for(NSDictionary *dInner in ar ){ NSInteger index=[self.arForTable indexOfObjectIdenticalTo:dInner]; isAlreadyInserted=(index>0 && index!=NSIntegerMax); if(isAlreadyInserted) break; } if(isAlreadyInserted) { [self miniMizeThisRows:ar]; } else { NSUInteger count=indexPath.row+1; NSMutableArray *arCells=[NSMutableArray array]; for(NSDictionary *dInner in ar ) { [arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]]; [self.arForTable insertObject:dInner atIndex:count++]; } [tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft]; } } } 

Un método que ayudará a minimizar y maximizar / expandir-colapsar filas.

 -(void)miniMizeThisRows:(NSArray*)ar{ for(NSDictionary *dInner in ar ) { NSUInteger indexToRemove=[self.arForTable indexOfObjectIdenticalTo:dInner]; NSArray *arInner=[dInner valueForKey:@"Objects"]; if(arInner && [arInner count]>0){ [self miniMizeThisRows:arInner]; } if([self.arForTable indexOfObjectIdenticalTo:dInner]!=NSNotFound) { [self.arForTable removeObjectIdenticalTo:dInner]; [self.tableView deleteRowsAtIndexPaths: [NSArray arrayWithObject:[NSIndexPath indexPathForRow:indexToRemove inSection:0]] withRowAnimation:UITableViewRowAnimationRight]; } } } 

Puede descargar el código fuente desde aquí.

Si esto ayuda: [Acceda a las secciones expandibles y conectables de uitableview] https://github.com/OliverLetterer/UIExpandableTableView

Tengo un enfoque un poco diferente de las vistas de tablas expandibles, una que se alinea con la forma en que generalmente se construyen estos tipos de vistas de tabla.

Hay encabezados y hay celdas . Los encabezados deben ser tappables , y luego las celdas debajo de los encabezados se mostrarán u ocultarán . Esto se puede lograr agregando un reconocedor de gestos al encabezado, y cuando se toca, simplemente elimina todas las celdas debajo de ese encabezado (la sección) y viceversa (agrega celdas). Por supuesto, debe mantener el estado de los encabezados “abiertos” y qué encabezados están “cerrados”.

Esto es bueno por un par de razones:

  1. El trabajo de los encabezados y las celdas está separado, lo que hace que el código sea más limpio.
  2. Este método fluye muy bien con la forma en que se construyen las vistas de tabla (encabezados y celdas) y, por lo tanto, no hay mucha magia: el código simplemente elimina o agrega celdas y debe ser compatible con las versiones posteriores de iOS.

Hice una biblioteca muy simple para lograr esto. Siempre que su vista de tabla esté configurada con las cabeceras y celdas de la sección UITableView, todo lo que tiene que hacer es crear una subclase de tabla y encabezado. Intentalo 🙂

Enlace: https://github.com/fuzz-productions/FZAccordionTableView

enter image description here

Intente usar este código … Puede ser que esto pueda ayudar … Y siéntase libre de editar el código de acuerdo con sus requisitos …

 #import "ViewController.h" #import  @interface ViewController () @end @implementation ViewController @synthesize myTable; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //myTable.backgroundColor=[UIColor clearColor]; // self.view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"wood.png"]]; muArr= [[NSMutableArray alloc]initWithObjects:@"Vinay",@"Anmol",@"Jagriti", nil]; ExpArr=[[NSMutableArray alloc]initWithObjects:@"Useeee",@"Thissss",@"Codeee", nil]; otherExpand=100; checker=100; } -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { return muArr.count; } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if(otherExpand==section) return ExpArr.count; return 0; } -(BOOL)tableView:(UITableView *)table canCollapse:(NSIndexPath *)indexPath { return NO; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *Identifier=@"Cell"; UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:Identifier]; if (cell==nil) { cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Identifier]; } cell.textLabel.text=[ExpArr objectAtIndex:indexPath.row]; cell.textLabel.backgroundColor=[UIColor clearColor]; UIView *viewww=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; viewww.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"wood.png"]]; cell.backgroundView=viewww; // cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"wood.png"]]; [tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLineEtched]; [tableView setSeparatorColor:[UIColor purpleColor]]; return cell; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view1=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; [view1.layer setCornerRadius:20]; view1.layer.borderWidth=2; view1.layer.borderColor=[UIColor brownColor].CGColor; UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10, 0, 295, 44)]; label.backgroundColor=[UIColor clearColor]; label.text=[muArr objectAtIndex:section]; UIButton *btn=[UIButton buttonWithType:UIButtonTypeDetailDisclosure]; btn.frame=CGRectMake(280, -5, 50, 50); btn.backgroundColor=[UIColor clearColor]; btn.tag=section; view1.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"wood.png"]]; label.textColor=[UIColor blackColor]; label.font=[UIFont fontWithName:@"American TypeWriter" size:18]; //btn.backgroundColor=[UIColor blackColor]; [view1 addSubview:btn]; [view1 addSubview:label]; [btn addTarget:self action:@selector(Btntap:) forControlEvents:UIControlEventTouchUpInside]; return view1; } -(void)Btntap : (UIButton *)btn { if(otherExpand!=100) { if (otherExpand==btn.tag) { NSMutableArray *tempArr2=[[NSMutableArray alloc]init]; for(int j=0;j 

Hay un gran video en WWDC 2011 llamado UITableView Cambios, sugerencias y trucos – sesión 125 que muestra cómo hacer cosas como esta.
También vea el código de ejemplo TVAnimationsGestures

Puede echar un vistazo a este ejemplo de acordeón en Swift: https://github.com/tadija/AEAccordion

enter image description here

Tiene muy poco código para crear el efecto de acordeón (no mediante el uso de secciones sino celdas), y como beneficio adicional también hay una solución para usar archivos XIB dentro de otros archivos XIB (útil para celdas personalizadas que usan vistas personalizadas).

Por favor prueba este ejemplo:

mejor ejemplo para TableView ampliable

https://github.com/OliverLetterer/UIExpandableTableView

TLIndexPathTools puede hacer este tipo de cosas de forma natural. De hecho, hay extensiones para secciones expansibles y estructuras de árbol expandibles. Intente ejecutar el proyecto de ejemplo Colapsar para secciones expandibles y el proyecto de muestra del Esquema para árboles expandibles.

Una ventaja del uso de TLIndexPathTools es que, como API simple de bajo nivel, puede resolver todo tipo de problemas de vista de tabla dinámica y vista de colección utilizando un enfoque común. Y funciona de manera intercambiable con Core Data y arreglos simples.

Mira este enlace:

http://iostechnotips.blogspot.in/2014/05/expandable-uitableview.html

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

* Utilice el método delegate viewForHeaderInSection y devuelva una UIView personalizada.

* Agregue un UIButton como subvista con la acción “expandible: (id) remitente” verifique el ID del remitente como número de sección y vuelva a cargar la vista de tabla.

En tu archivo .h

 LoadCustomCell *cell1; NSMutableArray *arrayForBool; NSMutableArray *questionArray; NSMutableArray *answerArray; 

En su archivo .m

  viewDidLoadMethod { _faqTblView.estimatedRowHeight = 30; _faqTblView.rowHeight = UITableViewAutomaticDimension; arrayForBool = [[NSMutableArray alloc]init]; _questionArray = [[NSMutableArray alloc]init]; _answerArray = [[NSMutableArray alloc]init]; for (int i = 0; i < _questionArray.count; i++) { [arrayForBool addObject:@"0"]; } self.faqTblView.dataSource = self; self.faqTblView .delegate = self; [self.faqTblView reloadData]; } 

después de esto

  #pragma mark - TableView Datasource & Delegate Method. -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [_questionArray count]; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { UILabel *lblText = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 260, 100)]; lblText.text = [_questionArray objectAtIndex:section]; return [lblText getLabelHeight] + 20;(created custom class) } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UITapGestureRecognizer *headerTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sectionHeaderTapped:)]; cell1 = [[[NSBundle mainBundle] loadNibNamed:@"LoadCustomCell" owner:self options:nil] objectAtIndex:0]; [cell1 setFrame:CGRectMake(0, 0, cell1.frame.size.width, cell1.frame.size.height)]; NSString *numStr = [NSString stringWithFormat:@"%ld. ",section + 1]; [cell1.sideMenuUserNameLabel setText:[numStr stringByAppendingString:[_questionArray objectAtIndex:section]]]; [cell1 setBackgroundColor:[UIColor lightGrayColor]]; cell1.tag = section; [cell1 addGestureRecognizer:headerTapped]; return cell1; } - (void)sectionHeaderTapped:(UITapGestureRecognizer *)gestureRecognizer { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:gestureRecognizer.view.tag]; if (indexPath.row == 0) { BOOL collapsed = [[arrayForBool objectAtIndex:indexPath.section] boolValue]; for (int i = 0; i < [_questionArray count]; i++) { if (indexPath.section==i) { [arrayForBool removeObjectAtIndex:i]; [arrayForBool insertObject:[NSString stringWithFormat:@"%d", !collapsed] atIndex:i]; } } NSLog(@"%@", arrayForBool); [self.faqTblView reloadSections:[NSIndexSet indexSetWithIndex:gestureRecognizer.view.tag] withRowAnimation:UITableViewRowAnimationAutomatic]; for (NSIndexPath *indexPath in self.faqTblView.indexPathsForSelectedRows) { [self.faqTblView deselectRowAtIndexPath:indexPath animated:NO]; } cell1.imageView.transform = CGAffineTransformMakeRotation(M_PI); } } -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *questionCellIdentifier = @"questionCellIdentifier"; QuestionCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:questionCellIdentifier]; if (cell == nil) { NSArray * myNib; myNib =[[NSBundle mainBundle]loadNibNamed:@"QuestionCustomCell" owner:self options:nil]; cell = (QuestionCustomCell *)[myNib lastObject]; } BOOL manyCells = [[arrayForBool objectAtIndex:indexPath.section] boolValue]; if(manyCells){ cell.questionNameLbl.text = [_answerArray objectAtIndex:indexPath.section]; } return cell; } 

Puede usar ExpyTableView

Lo que hace que una sección expansible de su celda determinada. Compatible con iOS 8.0. Tendrá flexibilidad al generar una vista de tabla ampliable con múltiples celdas de vista de tabla. Simplemente manipule los separadores para estados y luego nadie sabrá que está usando múltiples celdas para expandir.

  • Otras soluciones: manipula la altura para expandir una celda, cuando se necesita una actualización en el diseño de la celda, debe volver a construir todas las restricciones de diseño automático o la lógica en el código.

  • ExpyTableView: Usted hace una vista de tabla expandible al usar múltiples celdas e insertarlas y eliminarlas (lo que puede significar expandir y colapsar), tendrá una gran oportunidad en solicitudes de diseño futuras. Todo lo que tendrá que hacer es agregar una nueva UITableViewCell y escribir el código correspondiente. Fácilmente tendrá el nuevo diseño.

Todo lo que tiene que hacer es import ExpyTableView y luego:

 class ViewController: ExpyTableViewDataSource, ExpyTableViewDelegate { @IBOutlet weak var expandableTableView: ExpyTableView! // First, set data source and delegate for your table view. override func viewDidLoad() { super.viewDidLoad() expandableTableView.dataSource = self expandableTableView.delegate = self } // Then return your expandable cell instance from expandingCell data source method. func expandableCell(forSection section: Int, inTableView tableView: ExpyTableView) -> UITableViewCell { // this cell will be displayed at IndexPath with section: section and row 0 } } 

Puede ver que su sección anterior de vista de tabla ahora es una sección de vista de tabla expandible. También puede descargar el proyecto de ejemplo y ver ejemplos más detallados.