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 miUICollectionView
- 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)
}
Swift 4 Xcode 9.1 Beta 2
Agregar @objc
@objc func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize{
let size = CGSize(width: 400, height: 50)
return size
}
Créditos: https://medium.com/@zonble/your-delegation-methods-might-not-be-called-in-swift-3-c6065ed7b4cd
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í.