Sous-vue image est incorrecte lors de la création de UICollectionViewCell

Le problème

J'ai créé un UICollectionViewController avec une coutume UICollectionViewCell.
La coutume de cellules contient une grande et rectangulaire UIView (nommé colorView) et un UILabel (nommé nameLabel).

Quand la collection est d'abord renseignée avec ses cellules et j'ai l'impression colorView.le cadre, l'imprimé cadres ont des valeurs incorrectes. Je sais qu'ils sont incorrects, parce que le colorView images sont plus grandes que les cellules image d'eux-mêmes, même si le colorView pénètre correctement.

Cependant, si j'ai faites défiler la collectionView suffisant pour déclencher une réutilisation d'un déjà créé une cellule, la colorView.cadre a maintenant des valeurs correctes!
J'ai besoin de la corriger cadres parce que je veux appliquer des coins arrondis à l'colorView couche et j'ai besoin de la corriger coloView taille pour ce faire.
Par ailleurs, au cas où vous vous demandez, colorView.limites a la même taille incorrecte de valeur que la colorView.cadre.

La question

Pourquoi les cadres incorrecte lors de la création des cellules?

Et maintenant un peu de code

C'est mon UICollectionViewCell:

class BugCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var colorView: UIView!
    @IBOutlet weak var nameLabel: UILabel!
}

et c'est le UICollectionViewController:

import UIKit

let reuseIdentifier = "Cell"
let colors = [UIColor.redColor(), UIColor.blueColor(),
              UIColor.greenColor(), UIColor.purpleColor()]
let labels = ["red", "blue", "green", "purple"]

class BugCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return colors.count
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as BugCollectionViewCell

        println("ColorView frame: \(cell.colorView.frame) Cell frame: \(cell.frame)")

        cell.colorView.backgroundColor = colors[indexPath.row]
        cell.nameLabel.text = labels[indexPath.row]

        return cell
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        let width = self.collectionView?.frame.width
        let height = self.collectionView?.frame.height
        return CGSizeMake(width!, height!/2)
    }
}

L'affichage de la collection est le programme d'installation afin de montrer deux cellules à la fois, à la verticale, chaque cellule contenant un grand rectangle peint avec une couleur et une étiquette avec le nom de la couleur.

Lorsque j'exécute le code ci-dessus sur le simulateur, j'obtiens le résultat imprimé:

ColorView frame: (0.0,0.0,320.0,568.0) Cell frame: (0.0,0.0,375.0,333.5)
ColorView frame: (0.0,0.0,320.0,568.0) Cell frame: (0.0,343.5,375.0,333.5)

C'est un drôle de résultat - colorView.cadre a une hauteur de 568 points, tandis que la cellule de trame n'est 333.5 points de haut.

Si je fais glisser le collectionView vers le bas et une cellule devient réutilisés, le résultat suivant est imprimé:

ColorView frame: (8.0,8.0,359.0,294.0) Cell frame: (0.0,1030.5,375.0,333.5)
ColorView frame: (8.0,8.0,359.0,294.0) Cell frame: (0.0,343.5,375.0,333.5)

Quelque chose, que je ne peux pas comprendre, qui s'est passé le long du chemin qui corrige le cadre de colorView.

Je pense qu'il a quelque chose à voir avec le fait que la cellule est chargé à partir de la Pointe, de sorte qu'au lieu de l'aide de l'init(frame: cadre) initialiseur le contrôleur utilise la fonction init(codeur: aCoder) initialiseur, de sorte que dès que la cellule est créée, elle vient probablement avec certains d'image par défaut que je ne peux pas modifier de toute façon.

Je vais apprécier toute aide qui me permet de comprendre ce qui se passe!

Je suis en utilisant Xcode 6.1.1. avec le SDK iOS 8.1.

  • Comment vous positionnez ColorView? Vous n'êtes pas à l'aide de mise en page automatique de droite? Je pense que ce qui vous arrive est le point de vue mise en page est chargé de la plume et traduit de mise en page automatique. Mais votre storyboard viewcontroller la taille est différente pour le simulateur. Utiliser la mise en forme automatique de la position de votre point de vue et les choses devraient fonctionner à droite, puis.
  • Hey @CharlieWu, je suis en effet l'utilisation de l'auto mise en page... colorView et nameLabel sont entièrement contraint...
InformationsquelleAutor Felipe Ferri | 2015-02-02