TableView внутри ScrollView, как рассчитать высоту tableview во время выполнения? - PullRequest
0 голосов
/ 06 августа 2020

Есть табличный вид в режиме прокрутки, для идеальной прокрутки нужна высота табличного вида. Но есть динамика c высота ячейки и в ячейке несколько содержимого с динамическими c данными, такими как изображение (вычисление высоты изображения с библиотекой зимородка) и содержимое (с 0 количеством строк). Так что невозможно вычислить высоту каждой ячейки. Итак, я использую это для получения высоты ячейки: -

let totalCount = self.itemArray.data1.count + self.itemArray.data2.count
   if totalCount != self.totalHeightOfTable.count {
      //Appending height of cell
       self.tableView.reloadData()
       self.totalHeightOfTable.append(cell.frame.height)
       self.heightOfPost = self.totalHeightOfTable
       if totalCount == self.totalHeightOfTable.count {
          // Call back to get height of tableView
           self.getTotalHeightOfTableView?(self.totalHeightOfTable)
        }
  } 

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

прикрепленная структура пользовательского интерфейса

Ответы [ 3 ]

0 голосов
/ 06 августа 2020

Добро пожаловать в Stackoverflow!

Вы определенно можете получить contentSize и получить высоту вашего tableView. Я использую этот метод и работает каждый раз.

Один из способов сделать это - добавить наблюдателя, например:

tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

, а затем переопределить метод вашего контроллера, observeValue, вот так:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let obj = object as? UITableView {
        if obj == self.tableView && keyPath == "contentSize" {
            if let newSize = change?[NSKeyValueChangeKey.newKey] as? CGSize {
                let height = newSize.height // <----- your height!
            }
        }
    }
}

Чтобы добавить, возможно, было бы лучше, если бы в вашем методе viewWillDisappear или deinit удалили этого наблюдателя.

0 голосов
/ 06 августа 2020

Я понял вашу проблему , которую вы хотите вычислить динамика c таблица высота с высота гибких ячеек внутри tableview и в соответствии с этой высотой вы хотите обновить свой родительский scrollview contentSize height.

Я хочу сказать вам, что удалите все ваши расчеты высоты и просто поместите этот под простой функцией сбоку от контроллера представления .

ВАЖНО: - Не указывайте Ограничение по высоте в ваше табличное представление , если вы используете AutoLayout из раскадровки или программно.

любезно позаботьтесь об именах ваших переменных tableview и scrollview и замените их соответственно .

   //MARK:- viewDidLayoutSubviews will call after dynamic height calculation automatically
override func viewDidLayoutSubviews() {
    
    //isScrollEnabled of table view  should be dissable because our table is inside scrollview.
    tableView.isScrollEnabled = false
    
    
    //if above tableView.contentSize.height   not zero and giving acurate value then proceed further and update our parent scroll view contentsize height for height.
    print(tableView.contentSize.height)
    
    
    
    //place some bottom peeding as you want
    let bottomPedding:CGFloat = 30
    
    
    //Finally update your scrollview content size with newly created table height + bottom pedding.
    scrollview.contentSize = CGSize.init(width: scrollview.contentSize.width, height:tableView.contentSize.height + bottomPedding)
    
    
}

если это сработает, то fantasti c тогда отлично, остальное вы можете связаться со мной в любое время, мы понять это. asrathoreforiphone@gmail.com

0 голосов
/ 06 августа 2020

Вы можете использовать высоту contentSize как taleView.contentSize.height

...