O quadro de subview está incorreto ao criar UICollectionViewCell

O problema

Criei um UICollectionViewController com um UICollectionViewCell personalizado. A célula personalizada contém um UIView grande e retangular (denominado colorView) e um UILabel (denominado nameLabel).

Quando a coleção é preenchida pela primeira vez com suas células e eu imprimo colorView.frame, os quadros impressos têm valores incorretos. Sei que eles estão incorretos, porque os quadros colorView são maiores que o próprio quadro da célula, mesmo que o colorView seja desenhado corretamente.

No entanto, se eu rolar o collectionView o suficiente para acionar a reutilização de uma célula criada anteriormente, o colorView.frame agora terá os valores corretos! Preciso dos quadros corretos porque quero aplicar cantos arredondados à camada colorView e preciso do tamanho correto do coloView para fazer isso. A propósito, caso você esteja se perguntando, o colorView.bounds também possui o mesmo valor de tamanho errado que o colorView.frame.

A questão

Por que os quadros estão incorretos ao criar as células?

E agora algum código

Este é meu UICollectionViewCell:

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

e este é o 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)
    }
}

A exibição da coleção é configurada para mostrar duas células por vez, verticalmente, cada célula contendo um retângulo grande pintado com uma cor e um rótulo com o nome da cor.

Quando apenas executo o código acima no simulador, obtenho o seguinte resultado impresso:

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)

É um resultado estranho - colorView.frame tem uma altura de 568 pontos, enquanto o quadro da célula tem apenas 333,5 pontos de altura.

Se eu arrastar o collectionView para baixo e uma célula for reutilizada, o seguinte resultado será impresso:

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)

Algo que não consigo entender aconteceu no caminho que corrige o quadro do colorView.

Eu acho que tem algo a ver com o fato de que a célula é carregada da Nib, então, em vez de usar o inicializador init (frame: frame), o controlador usa o inicializador init (coder: aCoder), assim que a célula é criado provavelmente vem com algum quadro padrão que não consigo editar de qualquer maneira.

Agradeço qualquer ajuda que me permita entender o que está acontecendo!

Estou usando o Xcode 6.1.1. com o iOS SDK 8.1.

questionAnswers(4)

yourAnswerToTheQuestion