I built a generic UITableView to which I can pass a model and a custom UITableViewCell and it's working well except for two things: the cells height and the UITableView height.
I guess these two issues are related.
I'm trying multiple things I found on SO to help with it but nothing worked out.
Here is a sample of my generic UITableView:
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.register(Cell.self, forCellReuseIdentifier: "Cell")
    tableView.dataSource = self
    tableView.delegate = self
    tableView.separatorStyle = .none
    loadList(appendItems: true)
    initActions()
    initLayout()
}
func initLayout() {
    self.view.addSubview(tableView)
    self.view.addSubview(emptyView)
    self.view.addSubview(loadMoreButton)
    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.snp.makeConstraints { (make) -> Void in
        make.left.right.leading.trailing.top.equalToSuperview()
    }
    tableView.isScrollEnabled = false
    emptyView.translatesAutoresizingMaskIntoConstraints = false
    emptyView.isHidden = true
    emptyView.textAlignment = .center
    emptyView.snp.makeConstraints { (make) -> Void in
        make.left.right.leading.trailing.equalToSuperview()
        make.top.equalToSuperview().offset(8)
    }
    self.loadMoreButton.isHidden = true
    if(self.hasLoader == true) {
        self.loadMoreButton.isHidden = false
        loadMoreButton.translatesAutoresizingMaskIntoConstraints = false
        loadMoreButton.snp.makeConstraints { (make) -> Void in
            make.centerX.equalToSuperview()
            make.top.equalTo(tableView.snp.bottom)
        }
    }
}
Then, when my data is loaded I do:
self.tableView.reloadData()
self.tableView.snp.remakeConstraints { (make) -> Void in
    make.left.right.leading.trailing.top.equalToSuperview()
    if(self.hasLoader == true) {
        make.bottom.equalTo(self.loadMoreButton.snp.top)
    }
    make.height.equalTo(self.tableView.contentSize.height)
}
Then, my tableView funcs:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return resourceList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell
    let currentResource = resourceList[indexPath.row]
    cell.setResource(resource: currentResource) // Here I initialize my labels, UIImage, etc.
    cell.isUserInteractionEnabled = true
    self.cellHeight = cell.contentView.frame.size.height // Something I tried
    return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.tableView.deselectRow(at: indexPath, animated: true)
    let resource = resourceList[indexPath.row]
    if (resource.getRouteParam() != "") {
        router.setRoute(routeName: resource.getRouteName(), routeParam: resource.getRouteParam())
    }
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return self.cellHeight ?? 200 // Here I'm trying to return an *automatic* height of my custom cell
}
To complete I can say that my cells have different sizes due to different labels length so I can't define a static height.
I also tried to add estimatedHeightForRowAt in my viewDidLoad method but it didn't work either.
When I use UITableView.automaticDimension my cells have always a height of 44.0
 
    