¿Cómo cambiar el color de background de una sección completa en UICollectionView?

En UICollectionView, quiero darle a la sección completa un color de background uniforme, en lugar de una sola celda o la vista de colección completa.

No veo ningún método de delegado para hacer eso, ¿alguna sugerencia?

No he probado esto todavía, pero me parece que necesitas usar vistas de decoración si quieres un background detrás de tus celdas (como el estante de la aplicación Books). Creo que debería poder tener vistas diferentes para cada sección, y configurarlas usando el método de delegado layoutAttributesForDecorationViewOfKind:atIndexPath:

Este es un gran tutorial para cambiar el color de la sección UICollectionView:

Enlace actualizado, gracias al usuario @casamia

http://www.ericjchapman.com/jekyll/update/ios/2014/11/10/ios-changing-section-background-color-in-UICollectionView.html

Básicamente, tendremos que subclass UICollectionViewLayoutAttributes , UICollectionReusableView y UICollectionViewLayout para crear una instancia UICollectionReusableView como vista de background de la sección.

Este es su resultado:

introduzca la descripción de la imagen aquí

Siga el enlace para get más detalles sobre la explicación.

En la vista de colección, cada sección puede tener vistas adicionales, por lo tanto, coloque vistas adicionales para cada sección, luego establezca el color de background en vistas suplementarias en lugar de en las celdas de sección. Espero que te sirva de ayuda.

La idea es anular UICollectionViewLayoutAttributes para agregar un atributo de color. Y luego anular UICollectionReusableView, aplique el color al background de la vista.

https://github.com/strawberrycode/SCSectionBackground

Salí de este repository aquí https://github.com/SebastienMichoy/CollectionViewsDemo/tree/master/CollectionViewsDemo/Sources/Collections%20Views

Swift 3

subclass uicollectionreusableview

 class SectionView: UICollectionReusableView { static let kind = "sectionView" } 

subclass uicollectionViewFlowLayout

 class CustomFlowLayout: UICollectionViewFlowLayout { // MARK: Properties var decorationAttributes: [IndexPath: UICollectionViewLayoutAttributes] var sectionsWidthOrHeight: [IndexPath: CGFloat] // MARK: Initialization override init() { self.decorationAttributes = [:] self.sectionsWidthOrHeight = [:] super.init() } requinetworking init?(coder aDecoder: NSCoder) { self.decorationAttributes = [:] self.sectionsWidthOrHeight = [:] super.init(coder: aDecoder) } // MARK: Providing Layout Attributes override func layoutAttributesForDecorationView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { return self.decorationAttributes[indexPath] } override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { var attributes = super.layoutAttributesForElements(in: rect) let numberOfSections = self.collectionView!.numberOfSections var xOrYOffset = 0 as CGFloat for sectionNumber in 0 ..< numberOfSections { let indexPath = IndexPath(row: 0, section: sectionNumber) let numberOfItems = self.collectionView?.numberOfItems(inSection: sectionNumber) let sectionWidthOrHeight = numberOfItems == 0 ? UIScreen.main.bounds.height : collectionViewContentSize.height//self.sectionsWidthOrHeight[indexPath]! let decorationAttribute = UICollectionViewLayoutAttributes(forDecorationViewOfKind: SectionView.kind, with: indexPath) decorationAttribute.zIndex = -1 if self.scrollDirection == .vertical { decorationAttribute.frame = CGRect(x: 0, y: xOrYOffset, width: self.collectionViewContentSize.width, height: sectionWidthOrHeight) } else { decorationAttribute.frame = CGRect(x: xOrYOffset, y: 0, width: sectionWidthOrHeight, height: self.collectionViewContentSize.height) } xOrYOffset += sectionWidthOrHeight attributes?.append(decorationAttribute) self.decorationAttributes[indexPath] = decorationAttribute } return attributes } } 

implementar esto

Función CollectionView delegate

 func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) { Log.printLog(identifier: elementKind, message: indexPath) if elementKind == UICollectionElementKindSectionHeader, let view = view as? ProfileViewHeaderView { view.backgroundColor = UIColor(networking: (102 / 255.0), green: (169 / 255.0), blue: (251 / 255.0), alpha: 1) } else if elementKind == SectionView.kind { let evenSectionColor = UIColor.black let oddSectionColor = UIColor.networking view.backgroundColor = (indexPath.section % 2 == 0) ? evenSectionColor : oddSectionColor } } 

Esto es importante

 let layout = CustomFlowLayout() layout.register(SectionView.self, forDecorationViewOfKind: SectionView.kind) 

registre UICollectionReusableView con layout no collectionView.

una cosa más. Me metí con la altura en layoutAttributesForElements. debe cambiarlo por su propio proyecto.

He cambiado el color de background de cada sección de una manera muy simple en el siguiente método: Pero no estaba seguro de si es lo correcto. Pero funcionó.

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { FamilyCalendarCellItemCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"calendarItem" forIndexPath:indexPath]; Event *event; _headerView = [collectionView dequeueReusableSupplementaryViewOfKind: UICollectionElementKindSectionHeader withReuseIdentifier:@"EventHeader" forIndexPath:indexPath]; //headerView is declanetworking as property of Collection Reusable View class if(indexPath.section==0) { cell.backgroundColor=[UIColor orangeColor]; } else if(indexPath.section==1) { cell.backgroundColor=[UIColor yellowColor]; } return cell; }