ios header uicollectionview uicollectionreusableview

ios - Agregue una vista UIV simple como encabezado de UICollectionView



header uicollectionreusableview (3)

Tengo un UICollectionView . Me gustaría añadir un encabezado. Mi cabecera solo sería una UILabel . He :

1) se seleccionó el "Encabezado de sección" como accesorio de vista de colección en el IB.

2) creó una vista reutilizable de la colección en el IB, en el lateral, declarada como collectionViewHeader .

3) agregó esas líneas:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { if (kind == UICollectionElementKindSectionHeader) { return collectionViewHeader; } return nil; }

Pero nunca se les llama.

¿Tengo que crear una clase solo para esa etiqueta para poder usarla?

[self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];

?

¿Por qué no es tan simple como el UITableView donde simplemente arrastra y suelta el encabezado que desea? Las cosas son tan complicadas con UICollectionView ...


En rápido como abajo

Registrar vista de encabezado

collectionView.registerClass(HeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView")

En UICollectionViewDataSource

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView", forIndexPath: indexPath) headerView.frame.size.height = 100 return headerView }

Es importante que proporcione el diseño de flujo con el tamaño del encabezado

flowLayout.headerReferenceSize = CGSize(width: self.collectionView.frame.size.width, height: 100)

De lo contrario, el método de origen de datos no será llamado


Si no establece el encabezado en el guión gráfico, tendrá que registrarlo.

En viewDidLoad:

- (void)viewDidLoad { [self.collectionView registerClass:[YourOwnSubClass class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView"]; }

Pero de cualquier forma, tendrás que subclase UICollectionReusableView.

@interface YourOwnSubClass : UICollectionReusableView

entonces:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { YourOwnSubClass *headerView = [collectionView dequeueReusableSupplementaryViewOfKind: UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath]; [self updateSectionHeader:headerView forIndexPath:indexPath]; return headerView; } - (void)updateSectionHeader:(UICollectionReusableView *)header forIndexPath:(NSIndexPath *)indexPath { NSString *text = [NSString stringWithFormat:@"header #%i", indexPath.row]; header.label.text = text; }


Simplemente agregue la vista a UICollectionView y cambie las insets

collectionView.addSubview(headerView) collectionView.contentInset.top = 300 headerView.frame = CGRect(x: 0, y: -300, width: collectionView.frame.size.width, height: 300)