2016-10-17 2 views
6

У меня есть UITableView с ячейками с динамическим размером. Это означает, что я установил:Как получить высоту UITableView, когда ячейки имеют динамический размер?

tableView.estimatedRowHeight = 50.0 
tableView.rowHeight = UITableViewAutomaticDimension 

Теперь я хочу получить высоту всего вида таблицы. Я попытался получить его через tableView.contentSize.height, но это возвращает только примерную высоту строки, а не фактическую динамическую высоту представления таблицы.

Как получить динамическую высоту всего вида таблицы?

+0

Где вы получаете высоту столаView? –

+0

self.tableView.frame.size.height; –

+0

@Syed, это тоже не работает. – leonardloo

ответ

0

Вы должны рассчитать высоту Tableview в следующем методе делегата,

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 

    //Get the height required for the TableView to show all cells 
    if indexPath.row() == (tableView.indexPathsForVisibleRows.last! as! NSIndexPath).row { 
     //End of loading all Visible cells 
     float heightRequiredForTable = tableView.contentSize.height 

     //If cell's are more than 10 or so that it could not fit on the tableView's visible area then you have to go for other way to check for last cell loaded 
    } 
} 
+1

Я пытаюсь получить высоту табличного представления, поэтому я могу программно установить ограничения для представления таблицы. Я не думаю, что это работает. – leonardloo

+0

Если вы хотите установить высоту таблицыView как высоту, необходимую для всей ячейки, тогда вам нужно будет добавить UITableView в качестве дочернего элемента UIScrollView, а затем создать heightConstraint и обновить его в те же методы делегатов, что и объяснение в моем ответе на этот вопрос - http://stackoverflow.com/questions/38044803/uitableview-not-scrollable-but-enough-height/38045861#38045861 –

-1

вы можете попробовать этот код

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 
+0

Спасибо за предложение. Я пробовал это, но, к сожалению, он все еще не работает. – leonardloo

4

я, наконец, вырубали решение:

tableView.contentSize.height не будет работать для динамических ячеек, потому что они будут возвращать только количество ячеек * estimatedRowHeight.

Следовательно, чтобы получить динамическую высоту стола, вы ищете все видимые ячейки и суммируйте их высоты. Обратите внимание, что это работает только для табличных представлений, которые короче экрана.

Однако, прежде чем мы сделаем вышеуказанное, чтобы найти видимые ячейки, важно знать, что примечание нам нужно получить представление таблицы на экране, чтобы мы могли получить видимые ячейки. Для этого мы можем установить ограничение высоты для табличного представления некоторой сколь угодно большим числом только поэтому появляется на экране: высота

  1. Набор табличного ограничения:

    // Class variable heightOfTableViewConstraint set to 1000 
    heightOfTableViewConstraint = NSLayoutConstraint(item: self.tableView, attribute: .height, relatedBy: .equal, toItem: containerView, attribute: .height, multiplier: 0.0, constant: 1000) 
    containerView.addConstraint(heightOfTableViewConstraint) 
    
  2. Зов tableView.layoutIfNeeded(), и после его завершения, обратите внимание на видимые ячейки, обобщать их высоту и редактировать heightOfTableViewConstraint:

    UIView.animate(withDuration: 0, animations: { 
        self.tableView.layoutIfNeeded() 
        }) { (complete) in 
         var heightOfTableView: CGFloat = 0.0 
         // Get visible cells and sum up their heights 
         let cells = self.tableView.visibleCells 
         for cell in cells { 
          heightOfTableView += cell.frame.height 
         } 
         // Edit heightOfTableViewConstraint's constant to update height of table view 
         self.heightOfTableViewConstraint.constant = heightOfTableView 
    } 
    
+0

Где вы вызываете этот код для обновления ограничения высоты таблицыView? –

+0

В 'viewDidLoad' – leonardloo

+1

Это сработало для меня, но мне пришлось поместить мой код в' viewDidLayoutSubviews() ', потому что в' viewDidLoad() 'ячейки еще не загружены. –

1

Это уже ответили, но я хочу поделиться своим опытом.

У меня такая же проблема. Я искал ответы во многих похожих вопросах и пытался их ответы и не работал.

И наконец, я нашел leonardloo answer. Большое спасибо, но он еще не решил мою проблему. Я просто хочу закончить его ответ. Я ставлю этот код от его ответа:

UIView.animate(withDuration: 0, animations: { 
self.tableView.layoutIfNeeded() 
}) { (complete) in 
    var heightOfTableView: CGFloat = 0.0 
    // Get visible cells and sum up their heights 
    let cells = self.tableView.visibleCells 
    for cell in cells { 
     heightOfTableView += cell.frame.height 
    } 
    // Edit heightOfTableViewConstraint's constant to update height of table view 
    self.heightOfTableViewConstraint.constant = heightOfTableView 
} 

в этом блоке кода:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    if indexPath.row == data.count-1{ 
     // Insert the code here 
    } 
    return cell 
} 

Это означает, что после того, как все строки в таблице, были загружены, мы обновляем высоту используя этот фрагмент кода. Это работает !!!

+0

Это работает! Спасибо, Эбед! Просто один маленький вопрос. Вам нужно сделать «heightOfTableView + = cell.frame.height» еще один раз после цикла, потому что последняя ячейка еще не среди видимыхКелсов;) –

-1

Просто поддерживать массив типа CGFLoat и добавить UITableViewAutomaticDimension в cellForRowAtindexPath делегат tableview

var cellHeight = [CGFloat]() 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
cellHeight.append(UITableViewAutomaticDimension) 
} 
+0

Извините за грамматические ошибки, которые (Ошибки) отредактировали позже, но это отлично работает для меня –

0

Я добавлю свой ответ здесь, так как я боролся с этим немного.

В моем представлении таблицы использовались секции с заголовками, поэтому просто получение высоты видимых ячеек не работало. Что я в итоге сделал:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... // do your normal cell processing 

    // determine height and change it 
    if indexPath.section == (self.sectionTitles.count - 1) && indexPath.row == (sectionData.count - 1) { 

    UIView.animate(withDuration: 0, animations: { 
     self.tableView.layoutIfNeeded() 
    }) { complete in 

     // Edit heightOfTableViewConstraint's constant to update height of table view 
     self.tableViewHeightConstraint.constant = self.tableView.contentSize.height 
    } 
    } 
} 
Смежные вопросы