问题

我创建了一个带有自定义UICollectionViewCell的UICollectionViewController。
自定义单元格包含一个大而矩形的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)
    }
}

设置收集 View 是为了一次显示两个单元格,每个单元格包含一个涂有颜色的大矩形和一个带有颜色名称的标签。

当我在模拟器上运行以上代码时,得到以下打印结果:
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加载单元格有关,因此 Controller 不使用init(frame:frame)初始化程序,而是使用init(coder:aCoder)初始值设定项,因此,只要该单元格是创建它可能带有一些我无法编​​辑的默认框架。

我们将不胜感激,帮助您了解正在发生的一切!

我正在使用Xcode 6.1.1。使用iOS SDK 8.1。

最佳答案

您可以通过覆盖自定义Cell类中的layoutIfNeeded()来获得单元格的最终帧,如下所示:

override func layoutIfNeeded() {
    super.layoutIfNeeded()
    self.subView.layer.cornerRadius = self.subView.bounds.width / 2
}

然后在您的UICollectionView数据源方法cellForRowAtIndexPath中:执行以下操作:
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CustomCollectionViewCell
cell.setNeedsLayout()
cell.layoutIfNeeded()

关于ios - 创建UICollectionViewCell时 subview 框架不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28269452/

10-08 21:00