2017-04-11 82 views
0

我正在研究从服务器提取数据并在UITableView中显示数据的应用程序。数据是动态的,吸引来自社交网络的项目。如何根据多个视图配置动态UITableViewCell的高度

目前,我正在拉一个配置文件图片,用户名和社交网络句柄。该数据正以类似于Tweetbot显示其数据的方式显示在UITableView中。这里是Tweetbot的时间轴的参考:

Screenshot of Tweetbot Timeline

正如你所看到的,在最上面的帖子,正文中包含四个行。在我的第二篇文章中,正文文本只包含一行。您还可能注意到,在我的文章中,单元格的高度没有缩小,导致单元格剪辑了UIImageView。看起来,从图像的顶部到单元的顶部存在相同的空间量,因为从图像的底部到单元格的底部存在空间。但是当体内有多行文本时,单元格的高度会增加。

我通常设置UITableViewestimatedRowHeightrowHeight性质由钉扎的内容,允许动态的高度,但我不知道如何自动布局配置为允许基于多视图动态单元格高度。

一个想到我配置此布局的方法是检测单元格的高度,并将主体文本固定到单元格的底部,从而创建动态高度。然后,如果单元格的高度大于图像高度和图像到单元格顶部约束的总和乘以2(图像视图和单元格顶部和底部之间的底部和顶部间距),我会删除正文文本底部之间的约束并将约束添加到图像和单元格的底部。

总之,如果一个单元格只包含一行文本,我如何确保该单元格在不剪切图像的情况下尊重图片的尺寸?

回答

0

我通过创建两个约束来解决问题;一个在图像的底部和单元格的底部之间,另一个在标签的底部和单元格的底部之间。

予设定的图像和小区之间的约束为具有与relation ofgreaterThanOrEqual期望constant,而标签和小区之间的约束具有所需constantequal一个relation。通过这样做,如果正文文本变大,则greaterThanOrEqual将允许图像和单元格之间的约束增大,但绝不允许它变得小于所需的constant,并导致单元剪辑内容。

0

我回答了这个问题,因为它听起来像你的约束没有正确设置(从你自己的答案这个SO问题)。

如果您的约束得到满足,您将获得作为设置的一部分免费计算的动态高度。

下面是一个简单的例子,我做展示自我上浆UITableViewCell S:

https://github.com/runmad/SelfSizingUITableViewCellExample

而这里的一个小区为例约束:

class TableViewCell: UITableViewCell 
{ 

    let topView = UIView() 
    let label = UILabel() 
    let bottomView = UIView() 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     contentView.backgroundColor = UIColor.white 

     contentView.addSubview(topView) 
     topView.backgroundColor = UIColor.red 
     topView.translatesAutoresizingMaskIntoConstraints = false 
     topView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true 
     topView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true 
     topView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true 
     topView.heightAnchor.constraint(equalToConstant: 100).isActive = true 

     contentView.addSubview(label) 
     label.numberOfLines = 0 
     label.backgroundColor = UIColor.lightGray 
     label.translatesAutoresizingMaskIntoConstraints = false 
     label.topAnchor.constraint(equalTo: topView.bottomAnchor, constant: 10).isActive = true 
     label.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true 
     label.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true 

     contentView.addSubview(bottomView) 
     bottomView.backgroundColor = UIColor.blue 
     bottomView.translatesAutoresizingMaskIntoConstraints = false 
     bottomView.topAnchor.constraint(equalTo: label.bottomAnchor, constant: 10).isActive = true 
     bottomView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true 
     bottomView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true 
     bottomView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true 
     bottomView.heightAnchor.constraint(equalToConstant: 20).isActive = true 
    } 

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

    static func reuseIdentifier() -> String 
    { 
     return String(describing: self) 
    } 

} 

关键外卖(不管在单元格中的子视图的数量)是单元格中的子视图必须被限制到单元格的所有边缘,这允许它根据任何视图的intrinsicContentSize调整大小。如果您有多个子视图,则必须确保子视图之间的约束是正确的。

相关问题