Subview Frame ist falsch beim Erstellen von UICollectionViewCell

Das Proble

Ich habe einen UICollectionViewController mit einer benutzerdefinierten UICollectionViewCell erstellt. Die benutzerdefinierte Zelle enthält eine große und rechteckige UIView (mit dem Namen colorView) und ein UILabel (mit dem Namen nameLabel).

Wenn die Sammlung zum ersten Mal mit Zellen gefüllt wird und ich colorView.frame drucke, haben die gedruckten Frames falsche Werte. Ich weiß, dass sie falsch sind, da die ColorView-Rahmen größer sind als der Zellenrahmen selbst, obwohl die ColorView korrekt gezeichnet wird.

Wenn ich jedoch in der collectionView einen ausreichenden Bildlauf durchführe, um die Wiederverwendung einer zuvor erstellten Zelle auszulösen, weist die colorView.frame jetzt die richtigen Werte auf! Ich benötige die richtigen Rahmen, da ich abgerundete Ecken auf die ColorView-Ebene anwenden möchte und dazu die richtige ColoView-Größe benötige. Übrigens hat colorView.bounds, falls Sie sich fragen, auch den gleichen falschen Größenwert wie colorView.frame.

Die Frag

Warum sind die Frames beim Erstellen der Zellen falsch?

Und jetzt etwas Code

Dies ist meine UICollectionViewCell:

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

und dies ist der 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)
    }
}

Die Sammlungsansicht ist so eingerichtet, dass zwei Zellen gleichzeitig vertikal angezeigt werden. Jede Zelle enthält ein großes Rechteck mit einer Farbe und eine Beschriftung mit dem Farbnamen.

Wenn ich gerade den obigen Code auf dem Simulator ausführe, erhalte ich das folgende Druckergebnis:

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)

Es ist ein seltsames Ergebnis - colorView.frame hat eine Höhe von 568 Punkten, während der Zellenrahmen nur 333,5 Punkte hoch ist.

Wenn ich die collectionView nach unten ziehe und eine Zelle wiederverwendet wird, wird das folgende Ergebnis ausgegeben:

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)

Etwas, das ich nicht verstehen kann, ist auf dem Weg passiert, der den Frame von colorView korrigiert.

Ich denke, es hat etwas mit der Tatsache zu tun, dass die Zelle von der Nib geladen wird. Daher verwendet der Controller anstelle des Initialisierers init (Frame: Frame) den Initialisierer init (Coder: aCoder), also sobald die Zelle geladen ist erstellt wird, kommt es wahrscheinlich mit einem Standardrahmen, den ich sowieso nicht bearbeiten kann.

Ich freue mich über jede Hilfe, mit der ich nachvollziehen kann, was gerade passiert!

Ich verwende Xcode 6.1.1. mit dem iOS SDK 8.1.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage