3 votes

Swift : La collection View n'ajuste pas correctement à un changement de taille

J'ai une vue de collection avec 6 éléments qui doivent être disposés en 3 rangées et 2 colonnes. J'utilise le code suivant pour y arriver:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let totalWidth = collectionView.bounds.size.width - 12
    let totalHeight = collectionView.bounds.size.height - 18
    let heightOfView = (totalHeight / 3)
    let dimensions = CGFloat(Int(totalWidth))

        return CGSize(width: dimensions / 2, height: heightOfView)
}

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 6
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsetsMake(0, 5, 0, 5)
}

Dans viewDidLoad:

 override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.dataSource = self
    collectionView.delegate = self

    flowLayout.scrollDirection = .horizontal
    flowLayout.minimumLineSpacing = 5
    flowLayout.minimumInteritemSpacing = 5

Cela produit une vue de collection qui ressemble à ceci, ce qui est parfait:

C'est la sortie désirée

Cependant, lorsque je cache une vue situationnellement en dessous de la vue de collection avant que la vue ne soit chargée et que j'en ajuste la taille (en la rendant 50 points plus haute en hauteur), la sortie change pour ressembler à ce qui suit (voir l'image) avec les cellules 4 et 5 hors de l'écran sauf si elles sont défilées, seulement 2 rangées au lieu de 3 et un grand espace entre les rangées:

Apparence de la vue de collection lorsqu'elle est ajustée pour tenir compte de la vue cachée

Pour cacher situationnellement la vue dans viewWillAppear, j'ai ajouté ce qui suit:

 override func viewWillAppear(_ animated: Bool) {

    if testVariable == true {
        bottomView.isHidden = true
        // rend la hauteur de bottomView = 0
        bottomViewHeight.constant = 0
        // rend l'espace de la vue collection vers le bas du contrôleur de vue 0
        collectionToBase.constant = 0
        view.layoutIfNeeded()
    } 
}

Ce code teste si la variable testVariable est vraie et, si c'est le cas, masque le bottomView et agrandit la collectionView de 50 points pour remplir l'espace. J'ai ajouté ce code dans viewWillAppear dans l'espoir que collectionViewLayout tiendrait compte des 50 points de hauteur supplémentaires et s'ajusterait en conséquence, mais ce n'est pas le cas.

3voto

Bob Wakefield Points 141

Vous devez invalider la mise en page. Elle ne le fait pas automatiquement. Appelez invalidateLayout() sur la mise en page de flux après votre appel à layoutIfNeeded().

flowLayout.invalidateLayout()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X