Автоматическая высота 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, чтобы получить фактическую высоту для этой строки