以编程方式将UILabel添加到CollectionViewCells

时间:2017-09-03 12:05:24

标签: ios swift uicollectionview uicollectionviewcell

我的应用程序需要多个CollectionViews因此我决定以编程方式创建它们。我为每个单元格添加了UILabel但是UILabel仅添加到随机cell,而其他单元格没有显示任何标签。

如果我向上和向下滚动文本标签随机消失在某些单元格中并重新出现在其他单元格中。 这是对问题的直观描述

(注意我向下滚动时标签消失了)

我需要所有单元格来显示textLabels。

这是我正在使用的代码:

视图控制器

  override func viewDidLoad() {
    super.viewDidLoad()


   let frame =                  CGRect(x: 0 , y: 50 , width: 375 , height: 300)
   let layout =                 UICollectionViewFlowLayout()
   let collectionView =         UICollectionView(frame: frame , collectionViewLayout: layout)
    collectionView.delegate =   self
    collectionView.dataSource = self
    collectionView.register(CustomCell.self, forCellWithReuseIdentifier: NSStringFromClass(CustomCell.self))
    view.addSubview(collectionView)
}



func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 250    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell =             collectionView.dequeueReusableCell( withReuseIdentifier: NSStringFromClass(CustomCell.self), for: indexPath) as! CustomCell
    cell.nameLabel.text =  "XYZ"
    return cell

}

II 自定义单元格

class CustomCell: UICollectionViewCell {

 var nameLabel:  UILabel!

override init(frame : CGRect) {
    super.init(frame : frame)

    nameLabel =                 UILabel(frame:   self.frame)
    nameLabel.textAlignment =  .left
    nameLabel.textColor =      .black
    contentView.addSubview(nameLabel)
    contentView.backgroundColor = .red
  }

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

  }

造成这种异常行为的原因是什么?我是否错误地设置了collectionView

3 个答案:

答案 0 :(得分:2)

你在这一行nameLabel = UILabel(frame: self.frame)做错了,实际上你给的是与集合视图单元格位置(x和y坐标)相同的位置,这是错误的。你需要给nameLabel的位置x = 0和y = 0,然后它会正常工作。定义nameLabel的框架如下:

var nameLabel:  UILabel = UILabel(frame: CGRect.zero)

override init(frame : CGRect) {
    super.init(frame : frame)
    nameLabel.frame.size = CGSize(width: self.frame.width, height: self.frame.height)
}

输出如下:

enter image description here

答案 1 :(得分:1)

它似乎是一个出列问题,因为它在单元格出列时发生。

您应该在awakeFromNib方法中初始化UILabel - 这样每次一个单元格出列后,您将创建所需的标签。

此外,由于您是以编程方式创建UILabel,因此您应该查看此answer,基本上以编程方式创建UILabel时,您应该再设置一些值。

我还建议在创建标签时使用bringSubViewToFront

答案 2 :(得分:0)

问题是每个单元格都有不同的frame.origin值,因此设置UILabel(frame : self.frame )会不正确。

示例:

   let label = UILabel(frame: self.frame)
   print(self.frame)                     // (130.0, 420.0, 50.0, 50.0)

 // the origin of the label is now CGPoint(130.0, 420.0) with respect to the 
 //cell it would be totally out of bounds somewhere down below.               

每个origin的{​​{1}}必须为UILabel,以便它显示在相应单元格的顶部。

因此,简单的解决方案是用边界替换框架。

CGPoint(x :0,y :0)