Автоматическая высота UITableViewCell в зависимости от количества текста UILabel
У меня немного сложная настройка в моей раскадровке, у меня есть UIViewController, который содержит UITableViewController. В UITableViewController у меня есть несколько прототипных ячеек, которые я связал с подклассами объектов uitableviewcell в коде.
Используя ограничения и раскадровку, я бы хотел изменить высоту своей ячейки-прототипа в зависимости от размера, который заканчивается UILabel в зависимости от текста, попадающего в нее.
В настоящее время у меня есть
UIViewController
-- UITableViewController
-- -- UITableViewCell ((melchat) prototype cell)
-- -- -- ContentView
-- -- -- -- UIView ((background) view with drop shadow card type effect)
-- -- -- -- -- UIImageView (Avatar)
-- -- -- -- -- IUlabel (dynamic (depending on code/input) multi line UILabel)
Как бы я хотел, чтобы UILabel изменил размер UIView (фона), а затем, в свою очередь, изменил высоту этого UITableViewCell.
Я использую XCode 8.2.1
Я сделал снимок экрана с макетом в раскадровке и применил ограничения.
![enter image description here]()
Обновление
Я обновил свои ограничения, чтобы почти все вернуться к ContentView и обновил количество строк uilabel до 0, а затем также реализовал код UITableViewAutomaticDimension, но он все еще не работает. Пожалуйста, смотрите код и снимки экрана ниже.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
![enter image description here]()
![enter image description here]()
Ответы
Ответ 1
Пойти немного дальше на ответ Дао.
Он прав, вам нужно использовать UITableViewAutomaticDimension
Кроме того, вам необходимо убедиться, что вы устанавливаете свои ограничения таким образом, чтобы весь контент в ячейке был ограничен ячейками contentView. Таким образом, ваш ярлык, вероятно, потребует ограничений, таких как
- Ведущее ограничение для ImageView
- Верхнее ограничение для contentView
- Нижнее ограничение для contentView
- Трейлинг-ограничение для contentView
Убедитесь, что UILabel задан многострочный (или строки = 0), и он должен работать.
Если вы используете функции делегата heightForRowAt, убедитесь, что вы возвращаете UITableViewAutomaticDimension
Ответ 2
Используйте UITableViewAutomaticDimension
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300
Ответ 3
step1: Дайте ниже ограничение UIView, которое находится внутри contentView.
- Ведущее ограничение для contentView
- Верхнее ограничение для contentView
- Нижнее ограничение для contentView
- Трейлинг-ограничение для contentView
step2: Дайте ниже ограничение на UIlabel
- Ведущее ограничение для UIImageView
- Верхнее ограничение для UIView
- Нижнее ограничение для UIView
- Трейлинг-ограничение для UIView
step3: Затем выберите ограничение Trailing для IUlabel и выберите параметр редактирования, а затем выберите константу и выберите опцию moreThanEqual.
step4: установить метку numberofline = 0
step5: добавьте этот код в viewDidLoad()
yourtableview.estimatedRowHeight = 80.0
yourtableview.rowHeight = UITableViewAutomaticDimension
Ответ 4
Свифт 4.2 и 5. Как упоминалось выше, вы можете установить свойство объекта UITableView или
tblView.rowHeight = UITableView.automaticDimension
tblView.estimatedRowHeight = 300
вы также можете определить то же самое, реализовав методы UITableViewDelegate
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 300
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
}
Ответ 5
После заполнения UILabel и применения ограничений получите высоту метки и установите ее как высоту UIView.
После этого вызова -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
и передайте высоту UILabel/UIView, чтобы получить фактическую высоту для этой строки