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)