我有一个我要覆盖的自定义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
尺寸的灵活显示?
答案 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