UITableView具有3个自定义视图和动态高度

时间:2016-11-11 20:34:29

标签: ios iphone swift uitableview swift3

我做什么

我正在使用swift3(来自现有的Android版本)开发IOS应用程序。 我有一个UITableView,可以有3种类型的视图(作为单元格)。一种类型是标题,另一种类型代表不同类型(小时,照片或/和材料)。 看一下下一张图片来阐明架构:

enter image description here

我做了什么

经过几天的研究,我尝试了很多可能的解决方案。这是他们最好的意图:

  • 具有不同视图的静态行:

https://stackoverflow.com/a/30776750/2131420 这不是一个解决方案,因为视图的数量是静态的,我不能有随机的视图顺序(如果订单不同,应用程序崩溃...首先是视图2,然后是视图1,然后再次查看2 ...)

  • 包含所有视图类型的一个视图:

目前,这是最好的尝试...这包括绘制一个视图,里面有3种视图类型。每种视图类型都有一个UIView(如容器)。 然后,使用代码,使用不必要的UIView(容器)将视图的高度设置为0。 该方法的问题是细胞的自动尺寸。研究,我得到的比你可以将NSLayoutConstraints设置为隐藏的0。但是,如果你这样做,文字会被三个点(...)切断,我无法做到这一点。此外,我试图将属性lineBrake放到" WordWrap"并且行为0.这也没有解决问题。 图片示例: enter image description here

问题

如何根据数组中的值将不同视图加载到单元格中?如何根据内容的高度设置这些单元格的高度?

对不起英语,并提前致谢!

1 个答案:

答案 0 :(得分:2)

由于你需要动态单元格,我首先会为每个单元格创建3个xib,因为它们显示不同的视图并且彼此具有不同的模型。

确保单元格中项目的约束是可调整的 - 并且 - 仅当您的应用程序支持iOS 7之前的版本时 - 在tableView:heightForRowAtIndexPath:内返回固定大小。
Heres an easy tutorial to help you understand them better.

您应该实施UITableView委托方法

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

另外,实现tableView:estimatedHeightForRowAtIndexPath:以便为UITableView提供估计的单元格大小。

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

UITableView委托方法

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

             if indexPath.row == 0 {
               //Show your first cell
             }else if (model[indexPath.row].type == 1) { //or another way to distinguish from third cell
              //Show your second cell
             }else {
              //Show your third cell
             }
 }

别忘了在viewDidLoad()中将自定义单元格添加到UITableView

@IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
self.tableView.register(UINib(nibName: "FirstCell",bundle: nil), forCellReuseIdentifier: "FirstCell")
self.tableView.register(UINib(nibName: "SecondCell",bundle: nil), forCellReuseIdentifier: "SecondCell")
self.tableView.register(UINib(nibName: "ThirdCell",bundle: nil), forCellReuseIdentifier: "ThirdCell")
}