tutorial source example data collection ios uicollectionview

ios - source - El método UICollectionReusableView no se llama



uicollectionview swift 4 (7)

¿Agregaste UICollectionViewDelegateFlowLayout en la interfaz actual? Esto funcionó para mí.

@interface MyViewController () <UICollectionViewDelegateFlowLayout>

Quiero que mis secciones en el UICollectionView tengan un encabezado con una imagen.

He seguido estos pasos:

  • en el guión gráfico, UICollectionView un encabezado como accesorio para mi UICollectionView
  • le dio un identificador
  • creó una subclase de UICollectionReusableView para él
  • asignó la clase personalizada a la clase en el guión gráfico.
  • poner un ImageView en el accesorio de encabezado
  • hizo una salida para el ImageView en la clase personalizada en el archivo .h
  • Implementado lo siguiente en viewDidLoad :

[self.collectionView registerClass:[ScheduleHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier]; -(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableview = nil; if (kind == UICollectionElementKindSectionHeader) { ScheduleHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier forIndexPath:indexPath]; headerView.headerImageView.image = [UIImage imageNamed:@"blah.png"]; reusableview = headerView; } return reusableview; }

Sé que los métodos de datasource y delegate funcionan porque puedo ver todas las celdas y sus secciones. Sin embargo, no tengo mis encabezados. Puse un punto de interrupción en el método anterior y nunca se llama.

¿Qué estoy haciendo mal?


Existe la versión rápida:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { let size = CGSize(width: 400, height: 50) return size } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { let size = CGSize(width: 400, height: 50) return size }

¡XCode (versión 7.3.1) no propone estos métodos en autocompletar!

Si solo quieres un encabezado, solo conserva el método de encabezado.


Mi problema fue que en el veloz 3, el nombre de la función viewForSupplementaryElementOfKind ha cambiado ligeramente de las publicaciones que estaban en desbordamiento de pila. Por lo tanto, nunca fue llamado. Asegúrate de que, si estás en 3 rápidos, tu función de delegado coincide:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}


Parece que tiene que darle a su encabezado un tamaño distinto de cero o collectionView:viewForSupplementaryElementOfKind:atIndexPath no se llama. Por lo tanto, establezca la propiedad headerReferenceSize del diseño de flujo de la siguiente manera:

flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);

o implemente collectionView:layout:referenceSizeForHeaderInSection si desea variar el tamaño por sección.


Swift 3.0 (xcode 8.2.1)

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { return CGSize(width:collectionView.frame.size.width, height:30.0) }



Usted respondió la pregunta, pero en palabras lo entiendo mejor:

Para llamar al método, agregue estos métodos:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { return CGSizeMake(60.0f, 30.0f); } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { return CGSizeMake(60.0f, 30.0f); }

... e ir desde allí.