为什么UITableViewCell缩小contentView?

时间:2019-01-23 09:03:03

标签: ios uitableview autolayout

这是我要制作的UITableView

enter image description here

为了实现这一目标,我将单元格的contentView分为三部分。

1- fromView :包含开始时间和课程类型。高度将为 contentView

的30%

2- infoView :包含时钟图像,班级名称和教授的姓名。高度将为contentView的40%。

3- toView :包含结束时间和位置。高度将是剩余的空间(30%)。

首先,在详细介绍之前,我决定仅显示此容器。为了理解一个问题,我画了它们(分别是绿色,红色,蓝色)。

将它们添加到contentView之后,以下是我对这些容器施加的约束:

   fromView.easy.layout(Top(), Left(), Right(), Height(*0.3).like(contentView))

    infoView.easy.layout(Top().to(fromView), Left(), Right(), Height(*0.4).like(contentView))

    toView.easy.layout(Top().to(infoView), Left(), Right(), Bottom())

似乎一切都正确。启动后,我以为我会看到它们,但这是发生了什么:

enter image description here

我以为该单元不知道它的大小,所以我决定实现以下功能:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 150
}

此后,UITableView比以前正确显示了容器。但是,我计划将一些UILabel和其他views添加到该容器中(请看第一张图片)。换句话说,我不知道一个单元需要多大的尺寸。它需要是动态的。无论如何,我试图将这些标签添加到容器中,也许之后,一个单元格将确定高度。这是我的操作方式:

func setupViews() {

    fromView.addSubviews(fromTime, classType)

    toView.addSubviews(toTime, room)

    infoView.addSubviews(clockImage, teacherName, subjectName)

    contentView.addSubviews(toView, fromView, infoView)



}

func setupConstraints() {

    fromView.easy.layout(Top(), Left(), Right(), Height(*0.3).like(contentView))

    infoView.easy.layout(Top().to(fromView), Left(), Right(), Height(*0.4).like(contentView))

    toView.easy.layout(Top().to(infoView), Left(), Right(), Bottom())

    fromTime.easy.layout(CenterY(), Left(8))

    fromTime.setContentHuggingPriority(.required, for: .horizontal)

    fromTime.setContentCompressionResistancePriority(.required, for: .horizontal)

    classType.easy.layout(CenterY(), Left(8).to(fromTime))

    clockImage.easy.layout(CenterY(), Left(16), Width(24), Height(24))

    subjectName.easy.layout(CenterY(-8), Left().to(classType, .left), Right())

    teacherName.easy.layout(Top(8).to(subjectName), Left().to(subjectName, .left), Right())


    toTime.easy.layout(CenterY(), Left(8))

    toTime.setContentHuggingPriority(.required, for: .horizontal)

    toTime.setContentCompressionResistancePriority(.required, for: .horizontal)


    room.easy.layout(CenterY(), Left(8).to(toTime))

}

但是无论如何,问题又再次像这样出现:

enter image description here

我认为问题是我根据contentView的高度给容器指定了高度,但是contentView不知道其高度。但是我也不知道它需要多高,因为它需要根据标签的大小来确定。那么,如何解决这个问题呢?

3 个答案:

答案 0 :(得分:1)

尝试通过对单元格内的主视图设置高度限制。

答案 1 :(得分:1)

不设置容器的高度。您必须确保单元格的顶部和底部通过约束连接。我的建议是删除容器,直接将所有标签和图像添加到单元格,并创建这样的约束。

enter image description here

然后设置tableView.rowHeight = UITableView.automaticDimension,或从UITableView.automaticDimension返回tableView(_:heightForRowAt:)

答案 2 :(得分:1)

看起来您想要的是根据内容的自动版式计算的动态高度。更新委托以返回UITableViewAutomaticDimension的{​​{1}}和一些好的估计,例如heightForRowAt的150:

estimatedHeightForRowAt

然后,您可以使用自动布局来设置内容的大小,表格将为您动态计算单元格的高度。

估计的高度用于滚动目的-良好的估计将为您提供良好的滚动体验(仅当显示单元格时才计算动态高度,因此,对于尚未显示的单元格,func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return 150 } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } 将在以下情况下使用估计值:滚动)。