#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.
метод, когда вы что-то переопределяете, вы можете легко что-то сломать. Если только в документации об этом не сказано или вы действительно не знаете, что делаете