1
votes

Comment masquer l'en-tête sur la disposition de composition de la vue de collection iOS 13

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?


0 commentaires

3 Réponses :


0
votes
    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)
}

0 commentaires

-1
votes

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
    }


1 commentaires

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



0
votes

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
}


0 commentaires