在UICollectionView中滚动时,UILabel大小会更改

时间:2016-08-01 23:50:44

标签: ios swift uicollectionview uilabel

我有一个我要覆盖的自定义UICollectionViewCell。它有一个名为nameLabel的{​​{1}}类型的属性。我设置初始化时没有UILabel,并将frame设置为3.

numberOfLines

名称标签应用了以下VFL约束:

let nameLabel: UILabel = {
let label = UILabel()
label.numberOfLines = 3
label.sizeToFit()
return label
}()

其中 addConstraintsWithFormat("V:[v0]-10-[v1]-10-|", views: nameLabel, userLabel) 定义如下来自Brian Voong的UICollectionView示例:

addConstraintsWithFormat

发生的事情是,我有一个单元格,其extension UIView { func addConstraintsWithFormat(format: String, views: UIView...) { var viewsDictionary = [String: UIView]() for (index, view) in views.enumerate() { let key = "v\(index)" viewsDictionary[key] = view view.translatesAutoresizingMaskIntoConstraints = false } addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) } } 文本以三行呈现(足够的行,在给定约束条件下,需要三行包装)。

所以会发生什么,我滚动到那个单元格,它显示nameLabel有三行,我滚过那个单元格。当我向后滚动到那个单元格时,同样的nameLabel现在有一行。

如何根据呈现的内容保持UILabel尺寸的灵活显示?

2 个答案:

答案 0 :(得分:1)

我能够重现你的错误,以你上面的方式实现错误......

我没有看到你是如何在-cellForItemAtIndexPath中实现它的,但修正了它,你提供了一些修改,这里是我的-cellForItemAtIndexPath看起来像:

//--
// UICollectionView Delegates
func collectionView(collectionView: UICollectionView,
                    cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cvCell", forIndexPath: indexPath)

    // just to remove multi existence of identical views
    //
    cell.subviews.forEach { (view) in
        view.removeFromSuperview()
    }

    let nameLabel: UILabel = {

        let label = UILabel()

        // declare constant configurations here
        //
        label.numberOfLines = 3
        label.textAlignment = NSTextAlignment.Center
        label.text = "Index: \(indexPath.row)\n and this is quite a long text that will occuply 3 lines"

        return label
    }()

    // this is just an example base frame
    //
    nameLabel.frame = CGRectMake(0, 0, cell.frame.size.width/*your width*/, CGFloat.max)
    nameLabel.sizeToFit()

    cell.addSubview(nameLabel)

    // ...
    //
    // updates constraints here 

    return cell
}

希望这会对你有所帮助..干杯! :)

答案 1 :(得分:0)

我最终解决了错误,但设置了自动布局约束的可视化格式字符串。

我没有应用水平约束,也没有给UILabel固定宽度。我的新约束如下:

  addConstraintsWithFormat("H:|-20-[v0(200)]", views:nameLabel)
  addConstraintsWithFormat("V:[v0]-10-[v1]-10-|", views: nameLabel, userLabel)

之前我只有

  addConstraintsWithFormat("V:[v0]-10-[v1]-10-|", views: nameLabel, userLabel)

我根本没有使用sizeToFit()。以下是我UILabel课程中的UICollectionViewCell设置。

 let nameLabel: UILabel = {
  let label:UILabel = UILabel(frame: CGRectMake(0, 0, 200, 200))
  label.numberOfLines = 3
  label.lineBreakMode = NSLineBreakMode.ByWordWrapping
  let font = UIFont(name: "HelveticaNeue-Bold", size: 20.0)
  label.font = font
  return label
 }()

然后我在课程

中设置了文本
 nameLabel.text = name