Кадр подпредставления неверен при создании UICollectionViewCell
Эта проблема
Я создал UICollectionViewController с пользовательским UICollectionViewCell. Пользовательская ячейка содержит большой и прямоугольный UIView (с именем colorView) и UILabel (с именем nameLabel).
Когда коллекция впервые заполняется ее ячейками, и я печатаю colorView.frame, напечатанные кадры имеют неверные значения. Я знаю, что они неверны, потому что рамки colorView больше, чем сами ячейки, даже если colorView рисуется правильно.
Однако, если я прокручиваю collectionView достаточно, чтобы вызвать повторное использование ранее созданной ячейки, colorView.frame теперь имеет правильные значения! Мне нужны правильные кадры, потому что я хочу применить закругленные углы к слою colorView, и мне нужен правильный размер coloView для этого. Кстати, если вам интересно, colorView.bounds также имеет то же значение неправильного размера, что и colorView.frame.
Вопрос
Почему кадры некорректны при создании ячеек?
А теперь немного кода
Это мой UICollectionViewCell:
class BugCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var colorView: UIView!
@IBOutlet weak var nameLabel: UILabel!
}
и это 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)
}
}
Представление коллекции настроено для отображения двух ячеек одновременно, каждая из которых содержит большой прямоугольник, окрашенный цветом, и метку с названием цвета.
Когда я просто запускаю приведенный выше код на симуляторе, я получаю следующий печатный результат:
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)
Это странный результат - colorView.frame имеет высоту 568 точек, в то время как размер ячейки составляет всего 333,5 пункта.
Если я перетаскиваю collectionView вниз и ячейка снова используется, выводится следующий результат:
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)
Что-то, что я не могу понять, произошло по пути, которое исправляет кадр colorView.
Я думаю, что это как-то связано с тем, что ячейка загружается из Nib, поэтому вместо инициализатора init (frame: frame) контроллер использует инициализатор init (coder: aCoder), поэтому, как только ячейка будет созданный это, вероятно, идет с некоторой рамкой по умолчанию, которую я не могу редактировать так или иначе.
Я буду признателен за любую помощь, которая позволит мне понять, что происходит!
Я использую Xcode 6.1.1. с iOS SDK 8.1.