Je rencontre un point étonnant lors du déploiement de la mise en page compositionnelle iOS 13.
Je souhaite masquer l'en-tête de la vue de collection et implémenter la méthode referenceSizeForHeaderInSection
, mais referenceSizeForHeaderInSection
ne peut pas fonctionner sur la mise en page compositionnelle
Voici ma disposition compositionnelle:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { if isFullScreen { return CGSize(width: collectionView.frame.width, height: 18) } else { return CGSize.zero } }
Implémenter viewForSupplementaryElementOfKind
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { guard kind == SupplementaryViewOfKind.Header.rawValue, let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: XXXHeader.identifier, for: indexPath) as? XXXHeader else { return UICollectionReusableView() } if isFullScreen { // customer header with titleLabel property header.titleLabel.text = segmentedControl.titleForSegment(at: indexPath.section) } else { header.titleLabel.text = nil } }
Ensuite, j'ai essayé dans referenceSizeForHeaderInSection
mais je n'ai pas pu fonctionner
lazy var collectionViewLayout: UICollectionViewLayout = { // item layout deploy let cellItemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(0.2)) let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.33), heightDimension: .fractionalHeight(1.0)) let cellItem = NSCollectionLayoutItem(layoutSize: cellItemSize) let item = NSCollectionLayoutItem(layoutSize: itemSize) cellItem.contentInsets = NSDirectionalEdgeInsets(top: 4, leading: 4, bottom: 4, trailing: 4) item.contentInsets = NSDirectionalEdgeInsets(top: 4, leading: 4, bottom: 4, trailing: 4) // group layout deploy let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(0.2)) let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 3) let containerGroupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .absolute(215)) let containerGroup = NSCollectionLayoutGroup.vertical(layoutSize: containerGroupSize, subitems: [cellItem, group, group, group, group]) // section layout deploy let section = NSCollectionLayoutSection(group: containerGroup) section.contentInsets = NSDirectionalEdgeInsets(top: 4, leading: 0, bottom: 4, trailing: 0) // Headers layout deploy let headerSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .absolute(18)) let header = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: headerSize, elementKind: SupplementaryViewOfKind.Header.rawValue, alignment: .top) section.boundarySupplementaryItems = [header] let layout = UICollectionViewCompositionalLayout(section: section) return layout }()
Existe-t-il une idée ou une nouvelle façon de masquer l'en-tête de disposition de composition?
3 Réponses :
dataSource.supplementaryViewProvider = { [weak self] (collectionView: UICollectionView, kind: String, indexPath: IndexPath) -> UICollectionReusableView? iln guard let itamSequence = self?.dataSource?.itemIdentifier(for: indexPath) else { return nil } guard let section = self?.dataSource?.snapshot().sectionIdentifier(containingItem: itamSequence) else { return nil } let boardHeader = collectionView.dequeueReusableView(ofType: BoardSupplementaryView.self, forKind: UICollectionView.elementKindSectionHeader, for: indexPath) return boardHeader } } self.dataSource = dataSource updateSnapshot(animated: false) }
Ce que je fais:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { if needHideHeaderView { if let headerView = collectionView.supplementaryView(forElementKind: UICollectionView.elementKindSectionHeader, at: IndexPath(row: 0, section: section)) { headerView.isHidden = true } return CGSize.zero } else { // other code }
UICollectionViewDelegateFlowLayout ne doit pas être appelé lors de l'utilisation de la mise en page compositionnelle, n'a plus besoin de se conformer au protocole UICollectionViewDelegateFlowLayout
Lorsque vous générez une mise en page, l'index peut être transmis
func generateLayout() -> UICollectionViewLayout { let layout = UICollectionViewCompositionalLayout {(sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in // do your layout stuff here. With sectionIndex, you can layout differently for each section } return layout }