Как установить высоту UITableView в соответствии с его высотой содержимого? - PullRequest
0 голосов
/ 23 ноября 2018

У меня вопрос по поводу UITableView.
Я хочу разрешить высоту tableView в соответствии с высотой содержимого моих ячеек.
Итак, я успешно использую следующий код.

DispatchQueue.main.async {
    var frame = self.tableView.frame
    frame.size.height = self.tableView.contentSize.height
    self.tableView.frame = frame
}

Но когда у меня есть много данных, чтобы показать, мое содержимое будет за пределами экрана.
И tableView также вне экрана.
Есть идеи установить его ограничения и не выводить его за пределы экрана.
Я хочу установить 15 между макетом дна tableView и макетом дна superView.
Я использую SnapKit для установки автоматического размещения.

//I want to set this one is the biggest frame size. Other contents I can scroll the tableView to show the data.

tableView.snp.makeConstraints { (make) in 
    make.top.equalTo(self.topLayoutGuide.snp.bottom)
    make.left.equalTo(10)
    make.right.equalTo(-10)
    make.bottom.equalTo(-15)
} 

Ответы [ 6 ]

0 голосов
/ 23 ноября 2018

Вы можете создать пользовательский UITableView:

class AutomaticHeightTableView: UITableView {

  override var contentSize: CGSize {
    didSet {
      self.invalidateIntrinsicContentSize()
    }
  }

  override var intrinsicContentSize: CGSize {
    self.layoutIfNeeded()
    return CGSize(width: UIViewNoIntrinsicMetric, height: contentSize.height + 20)
  }

}

, а затем установить UITableView Class на AutomaticHeightTableView.

Это решение основано на ответе, найденном в stackoverflow.

0 голосов
/ 23 ноября 2018

Я решил похожую проблему, используя следующий метод.Вам нужно всего несколько строк кода.

override func viewDidLoad() {
    super.viewDidLoad()
    setupTableView()
}

private func setupTableView() {
    tableView.estimatedRowHeight = 44.0
    tableView.rowHeight = UITableViewAutomaticDimension
}

Просто установите приблизительную высоту строки для UITableView, а затем установите rowHeight как UITableViewAutomaticDimension.

0 голосов
/ 23 ноября 2018

Поместите ваш UITableView в UIScrollView и добавьте ограничения следующим образом:

Ограничения для представления таблицы

enter image description here

Создайте IBOutlet из ограничения высоты и затем переопределите viewWillLayoutSubviews в вашем UIViewController

override func viewWillLayoutSubviews() {
    super.updateViewConstraints()
    self.tableViewHeightConstraint.constant = tableView.contentSize.height
}
0 голосов
/ 23 ноября 2018

Работа с кодом:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tblHeightConstraint: NSLayoutConstraint! // tableView Height Constraint
    @IBOutlet weak var tblView: UITableView!

    var tblMaxHeight : CGFloat = 50

    override func viewDidLoad() {
        super.viewDidLoad()

        let navHeight = (self.navigationController?.navigationBar.frame.size.height)! + UIApplication.shared.statusBarFrame.size.height

        tblMaxHeight = self.view.frame.size.height - 40 - navHeight

    }


    override func viewDidLayoutSubviews(){

        tblHeightConstraint.constant = min(tblMaxHeight, tblView.contentSize.height)
    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 24
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")

        cell?.textLabel?.text = "Row: #\(indexPath.row)"

        return cell!
    }


}

Ограничения на просмотр таблицы:

enter image description here

Вывод:

enter image description here

enter image description here

0 голосов
/ 23 ноября 2018

Может быть, вы можете ограничить высоту рамки таблицы, убедившись, что она не длиннее, чем ее superView, как-то так, изменив код:

DispatchQueue.main.async {
    if let superViewHeight = self.tableView.superView?.bounds.maxY {
        let maxHeight = superViewHeight - self.tableView.frame.minY
        var frame = self.tableView.frame
        frame.size.height = min(self.tableView.contentSize.height, maxHeight)
        self.tableView.frame = frame
    }
}
0 голосов
/ 23 ноября 2018

Вы пробовали

self.tableView.invalidateIntrinsicContentSize()

https://developer.apple.com/documentation/uikit/uiview/1622457-invalidateintrinsiccontentsize

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...