我UICollectionView给自己添加了一个,UIViewController并为其创建了一个自定义单元。
UICollectionView
UIViewController
我使用sizeForItemAtIndexPath方法设置单元格的大小,并将每个单元格设置为UIScreen.mainScreen().bounds.width/2高度和宽度。因此,基本上每个单元格都是屏幕宽度的一半,并且高度相同。
sizeForItemAtIndexPath
UIScreen.mainScreen().bounds.width/2
然后,我UIImageView在单元格内部创建了一个单元,每个边缘固定到单元格的相对边缘,以便图像视图填充单元格。我也有一个UILabel在单元格中垂直和水平居中的。
UIImageView
UILabel
但是,在初次加载时,单元格的大小正确,但左上角的小方块中的内容要小得多。(在下图中看到,我已将单元格的contentView背景色设置为绿色,并将imageView背景色设置为红色)。
然后向下滚动一点(我假设一个可重复使用的单元格已出队),所有单元格都很好(并在向上滚动后保持良好)。
是什么原因导致内容在首次加载时未受到适当限制?
更新
我的一些代码UIViewController:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { var cell = collectionView.dequeueReusableCellWithReuseIdentifier("PrevDrawCell", forIndexPath: indexPath) as? PrevDrawCell if cell == nil { cell = PrevDrawCell() } cell!.drawVC = self cell!.imageShortCode = self.tempImageURLs[indexPath.row] // Pull image (async) and set after download cell!.setupImage() cell!.contentView.backgroundColor = UIColor.greenColor() cell!.coverView.backgroundColor = UIColor.redColor() cell!.dateLabel.font = UIFont(name: "HelveticaNeue-Light", size: 26) cell!.dateLabel.text = "\(self.tempImageURLs.count-indexPath.row)/9" return cell! } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let size = UIScreen.mainScreen().bounds.width/2 return CGSize(width: size, height: size) } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { return UIEdgeInsetsZero } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { return 0 } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat { return 0 }
看起来它仍然为contentView保留了100x100px的基本尺寸,而单元格本身已经获得了正确的尺寸。您可以在返回单元格之前强制布局重置以添加以下行:
cell?.layoutIfNeeded()