web-dev-qa-db-fra.com

Taille incorrecte du contenu UICollectionViewCell lors du premier chargement

J'ai ajouté un UICollectionView à mon UIViewController et j'ai créé une cellule personnalisée pour celui-ci.

J'ai défini la taille de la cellule à l'aide de la méthode sizeForItemAtIndexPath et défini chaque cellule sur UIScreen.mainScreen().bounds.width/2 en hauteur et en largeur. Donc, essentiellement, chaque cellule est la moitié de l'écran large et cette même longueur en hauteur.

J'ai ensuite un UIImageView à l'intérieur de la cellule avec chaque bord épinglé à son bord relatif de la cellule afin que la vue d'image remplisse la cellule. J'ai également un UILabel qui est centré verticalement et horizontalement dans la cellule.

Cependant au premier chargement, la cellule a la bonne taille mais le contenu est beaucoup plus petit dans un petit carré en haut à gauche. (Vu dans l'image ci-dessous, j'ai défini la couleur d'arrière-plan contentView de la cellule sur vert et la couleur d'arrière-plan imageView sur rouge).

enter image description here

Ensuite, après avoir défilé un peu (et je suppose qu'une cellule réutilisable est retirée de la file d'attente), toutes les cellules sont correctes (et restent correctes après avoir remonté).

enter image description here

Qu'est-ce qui empêche le contenu d'être correctement contraint lors du premier chargement?

[~ # ~] mise à jour [~ # ~]

Une partie du code de mon UIViewController:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        var cell = collectionView.dequeueReusableCellWithReuseIdentifier("PrevDrawCell", forIndexPath: indexPath) as? PrevDrawCell

        if cell == nil {
            cell = PrevDrawCell()
        }

        cell!.drawVC = self
        cell!.imageShortCode = self.tempImageURLs[indexPath.row]

        // Pull image (async) and set after download
        cell!.setupImage()

        cell!.contentView.backgroundColor = UIColor.greenColor()
        cell!.coverView.backgroundColor = UIColor.redColor()

        cell!.dateLabel.font = UIFont(name: "HelveticaNeue-Light", size: 26)
        cell!.dateLabel.text = "\(self.tempImageURLs.count-indexPath.row)/9"

        return cell!
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let size = UIScreen.mainScreen().bounds.width/2
        return CGSize(width: size, height: size)
}


func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
        return UIEdgeInsetsZero
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
    return 0
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
    return 0
}
29
myles

Il semble qu'il conserve toujours sa taille de base 100x100px pour le contentView tandis que la cellule elle-même obtient déjà la bonne taille. Vous pouvez forcer la mise en page à réinitialiser en ajoutant la ligne suivante juste avant de renvoyer la cellule:

cell?.layoutIfNeeded()
57
Departamento B

J'ai eu une fois un problème similaire (le contenu de ma cellule ne correspondait pas à la cellule même avec une mise en page automatique correcte). Le bogue a été provoqué en n'appelant pas super.layoutSubviews() dans la fonction surchargée layoutSubviews () qui était dans la classe de Cell.

3
Magda

Pour ceux qui utilisent Storyboard + AutoLayout et choisissent les contraintes actives au moment de l'exécution:

Lorsque vous utilisez dequeueReusableCell, au premier chargement, la cellule est créée mais sa vue n'a pas été initialisée, donc les modifications de contrainte ne sont pas enregistrées - tout ce que vous avez défini dans Storyboard est utilisé. La solution pour moi était de mettre à jour les contraintes après le chargement de la vue:

override func layoutSubviews() {
    super.layoutSubviews()
    adjustIconWidths()
}
0
vin047