Quiero que mis secciones en el UICollectionView
tengan un encabezado con una imagen.
He seguido estos pasos:
- en el guión gráfico, asigné un encabezado como accesorio para mi
UICollectionView
- le dio un identificador
- creó una subclase de
UICollectionReusableView
para ello - asignó la clase personalizada a la clase en el guión gráfico.
- poner un
ImageView
accesorio en el encabezado - hizo una salida para la
ImageView
clase personalizada en el.h
archivo - Implementó 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 fuente de datos y delegado están funcionando 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?
ios
uicollectionview
Eden V.
fuente
fuente
kind == UICollectionElementKindSectionHeader
lugar del contenido de las cadenas, probablemente desee utilizar[kind isEqualToString: UICollectionElementKindSectionHeader]
en su lugar.Respuestas:
Parece que tienes que darle a tu encabezado un tamaño distinto de cero o
collectionView:viewForSupplementaryElementOfKind:atIndexPath
no se llama. Entonces, establezca laheaderReferenceSize
propiedad del diseño de flujo así:flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);
Rápido 5+
flowLayout.headerReferenceSize = CGSize(CGSize(width: self.collectionView.frame.size.width, height: 100))
o, impleméntelo
collectionView:layout:referenceSizeForHeaderInSection
si desea variar el tamaño por sección.fuente
headerReferenceSize
funciona pero necesito diferentes tamaños para diferentes secciones. Y el método que especificó no se llama en absolutoRespondiste la pregunta, pero con palabras entiendo mejor:
Para hacer que se llame 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); }
... y partir de ahí.
fuente
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
fuente
¿Agregó UICollectionViewDelegateFlowLayout en la interfaz actual? Esto funcionó para mí.
@interface MyViewController () <UICollectionViewDelegateFlowLayout>
Rápido:
class MyViewController: UICollectionViewDelegateFlowLayout {
fuente
UICollectionViewDelegateFlowLayout
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) }
fuente
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 desea un encabezado, mantenga el método del encabezado.
fuente
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:) func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { }
El código anterior funcionó para mí
fuente
Mi problema fue que en Swift 3, el nombre de la función viewForSupplementaryElementOfKind ha cambiado ligeramente de cualquier publicación que estuviera en desbordamiento de pila. Por lo tanto, nunca fue llamado. Asegúrese de que, si está en swift 3, su función delegada coincide:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}
fuente
Tengo el mismo problema. He agregado,
referenceSizeForFooterInSection
pero tampocoviewForSupplementaryElementOfKind
me llaman. He agregado este códigoviewDidLoad()
y funcionó para mí:if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.sectionFootersPinToVisibleBounds = true }
fuente
Para mí, en Swift 4.2, nunca se llamó a func collectionView (collectionView: kind: indexPath :) -> UICollectionReusableView. Esto fue para una vista de colección en un UIViewController. Noté que las funciones de vista de colección existentes estaban calificadas con @objc, y que UICollectionView no había adoptado los protocolos UICollectionViewDataSource y UICollectionViewDelegate. Tan pronto como adopté los protocolos, recibí errores de que las funciones de vista de colección no coincidían con el protocolo. Corrigí la sintaxis de la función, eliminé los calificadores y los encabezados de las secciones comenzaron a funcionar.
fuente
Si tiene una subclase genérica, debe tener cuidado de especificar el nombre del método delegado de ObjC si es diferente al nombre de Swift ( https://bugs.swift.org/browse/SR-2817 ).
@objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:) func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { ...
fuente