получить высоту табличного представления

#swift #uitableview

Вопрос:

У меня есть вид таблицы между меткой, которая находится сверху (ограничения: выровнять по центру x, выровнять сверху до 20).

Кнопка находится внизу (ограничения: выровнять по центру x, выровнять снизу до 50).

И вид таблицы выровнен между этими двумя объектами сверху/снизу до 20.

Я пытаюсь прочитать высоту табличного представления, потому что в зависимости от того, какое устройство я использую, высота должна отличаться? Но если я использую в своем коде следующее, я всегда получаю одинаковую высоту для просмотра таблицы.

Результат печати всегда равен 616.

Что я упускаю/неправильно понимаю?

  @IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    print(tableView.frame.size.height)
}
 

введите описание изображения здесь

Комментарии:

1. Я думаю, что автозапуск обрабатывает это автоматически.

Ответ №1:

Попробуйте этот метод

 override func viewWillLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print(tableView.frame.size.height)
}
 

Причина, по которой вы видите напечатанные два разных значения, заключается в том, что этот метод вызывается сразу после загрузки viewdid и еще раз после применения всех вычислений автоматической компоновки или автоматического изменения размера для представлений. Это означает, что метод viewDidLayoutSubviews вызывается каждый раз при изменении размера представления и пересчете макета представления.

Для получения дополнительной информации об этом см.
Документация Apple по viewdidlayoutsubviews

Комментарии:

1. Теперь я понимаю. Но я хочу рассчитать высоту строк ячеек на основе высоты табличного представления. Чтобы полностью заполнить пространство, независимо от того, какое устройство я использую, но расчет кажется очень «запоздалым», всякий раз, когда появляется представление, я вижу, что ячейки имеют разную высоту, затем оно вычисляется, а затем изменяется. есть идеи, как я могу получить высоту раньше?

2. можете ли вы поделиться кодом, в котором вы указываете высоту ячеек?

3. ну, я только что вставил свой код в viewWillLayoutSubviews: переопределить функцию viewDidLayoutSubviews() { super.viewDidLayoutSubviews() TableView.RowHeight = TableView.frame.size.height / CGFloat(имена игроков. количество) }

4. или вы можете добавить TableView.frame.size.height / CGFloat(имена игроков.количество) в метод делегирования heightforrowat для tableview, который, я думаю, был бы более подходящим.

Ответ №2:

попробуйте набрать свой рост в

 override func viewWillLayoutSubviews() {
    print(tableView.frame.size.height)
}
 

Комментарии:

1. Спасибо! это помогло. но по некоторым причинам я получаю теперь два заявления о печати, один раз снова 616, а затем меньшее число. Почему это так?

Ответ №3:

Когда ваш контроллер просмотра создается из раскадровки, все начальные кадры совпадают с выбранными вами на раскадровке, поэтому они будут правильными только для устройства, выбранного на раскадровке

Первый раз вы можете получить доступ к реальным кадрам после первого layoutSubviews , поэтому вам это нужно:

 override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print(tableView.frame.size.height)
}
 

Узнайте больше о жизненном цикле просмотра здесь

p.s. новее забудьте вызвать super. метод, когда вы что-то переопределяете, вы можете легко что-то сломать. Если только в документации об этом не сказано или вы действительно не знаете, что делаете