¿Cómo agregar dinámicamente tags y botones en el encabezado de sección de UICollectionView?

Por favor, ayúdenme cómo puedo agregar tags horizontalmente y botones similares de manera horizontal, pero cada button debe alinearse hacia abajo de cada label como una sección diferente. Esto debería suceder dinámicamente en el encabezado de UICollectionView ya que el número de tags y botones está de acuerdo con mis datos.

Quiero hacer un layout de Excel y en el encabezado quiero mostrar los controles anteriores.

¡Gracias por adelantado!

He hecho esto-

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableview = nil; if (kind == UICollectionElementKindSectionHeader) { DepartmentCollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath]; for (int i=0; i<_officelist.count; i++) { UILabel *label = [[UILabel alloc] init]; label.tag = i+1; label.text=[NSString stringWithFormat:@"%@",_officelist[i]]; [self.roadmapCollectionView addSubview:label]; } reusableview = headerView; } return reusableview; } 

OfficeList es mi matriz que contiene la list que quiero mostrar en cada label en el valor del índice.

Esto funciona perfectamente bien:

 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath]; CGFloat x=0,y=0; for (int i = 0;i<[_officelist count];i++) { id val=[officeSize objectAtIndex:i]; CGFloat val1=[val floatValue]; UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(x, 10,val1-1,35)]; newLabel.text=[NSString stringWithFormat:@"%@",_officelist[i]]; newLabel.textAlignment = NSTextAlignmentCenter; newLabel.backgroundColor = [UIColor greenColor]; [self.roadmapCollectionView addSubview:newLabel]; x=x+val1+1; } for (int i=0; i<_departmentlist.count; i++) { dept=[_departmentlist objectAtIndex:i]; id val=[officeSize objectAtIndex:i]; CGFloat val1=[val floatValue]; float val2=val1/[dept count]; //NSLog(@"DEPT SIZE - %f",val2); for (int j = 0; j < [dept count]; j++) { UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(y, 50,val2-1, 25); [button setBackgroundColor:[UIColor yellowColor]]; [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; [button setTitle:[NSString stringWithFormat:@"%@",dept[j]] forState:UIControlStateNormal]; [self.roadmapCollectionView addSubview:button]; [deptSize addObject:[NSNumber numberWithFloat:y]]; y=y+val2+1; } } return reusableView; } 

UICollectionView proporciona devoluciones de llamada:

  • Cada vez que se va a mostrar una vista supplementaryView

     - (void)collectionView:(UICollectionView *)collectionView willDisplaySupplementaryView:(UICollectionReusableView *)view forElementKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath 
  • Cada vez que una vista supplementaryView desplaza fuera de la pantalla,

     - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingSupplementaryView:(UICollectionReusableView *)view forElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath 

Deberá search el parámetro elementKind aquí. Tiene dos valores UICollectionElementKindSectionHeader y UICollectionElementKindSectionFooter .

Creo que necesita hacer sus personalizaciones con UICollectionElementKindSectionHeader .

Espero eso ayude.

ACTUALIZAR:

Si UICollectionView no proporciona una forma de personalizarlo sobre la marcha como se describe anteriormente, el enfoque recomendado sería diseñar UICollectionElementKindSectionHeader en el guión gráfico.

Todo lo que necesita hacer es arrastrar una UICollectionReusableView dentro de su collectionView en la jerarquía de la vista. También es posible que deba considerar establecer una subclass personalizada para esto y agregar conexiones IBOutlet a diferentes componentes de la interfaz de usuario.

Prueba este codigo

ACTUALIZACIÓN: intente establecer restricciones para uilabel mediante progtwigción.

 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableview = nil; if (kind == UICollectionElementKindSectionHeader) { DepartmentCollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath]; UIFont * customFont = [UIFont fontWithName:ProximaNovaSemibold size:12]; CGSize labelSize = [text sizeWithFont:customFont constrainedToSize:CGSizeMake(380, 20) lineBreakMode:NSLineBreakByTruncatingTail]; UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(91, 15, labelSize.width, labelSize.height)]; label.tag = indexPath.row; label.text=[NSString stringWithFormat:@"%@",_officelist[indexPath.row]]; label.font = customFont; label.numberOfLines = 1; label.baselineAdjustment = UIBaselineAdjustmentAlignBaselines; label.adjustsFontSizeToFitWidth = YES; label.adjustsLetterSpacingToFitWidth = YES; label.minimumScaleFactor = 10.0f/12.0f; fromLabel.clipsToBounds = YES; label.backgroundColor = [UIColor clearColor]; label.textColor = [UIColor blackColor]; label.textAlignment = NSTextAlignmentLeft; [self.roadmapCollectionView addSubview:label]; reusableview = headerView; } return reusableview; } 

Recomendaría que creara una vista en el guión gráfico y la infle cada vez que las mediciones muestren que tiene que inflarse.