it-roy-ru.com

Автоматическая высота 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

9
HurkNburkS

Чтобы пойти немного дальше в ответ Дао .. 

Он правильный, нужно использовать UITableViewAutomaticDimension

Кроме того, необходимо убедиться, что вы настроили свои ограничения таким образом, чтобы весь контент в ячейке был ограничен содержимым ячеек contentView. Таким образом, вашему лейблу, вероятно, понадобятся такие ограничения, как

  • Ведущее ограничение для ImageView
  • Верхнее ограничение для contentView
  • Нижнее ограничение для contentView
  • Конечное ограничение для contentView

Убедитесь, что для UILabel установлено значение multiline (или lines = 0), и оно должно работать. 

Если вы используете делегатские функции heightForRowAt, убедитесь, что вы возвращаете UITableViewAutomaticDimension

22
Scriptable

Используйте UITableViewAutomaticDimension

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300
11
Đào Minh Hạt

шаг 1: Задайте ниже ограничение для UIView, которое находится внутри contentView.

  • Ведущее ограничение для contentView
  • Верхнее ограничение для contentView
  • Нижнее ограничение для contentView
  • Конечное ограничение для contentView

шаг 2: Дайте ниже ограничение для UIlabel 

  • Ведущее ограничение для UIImageView
  • Главное ограничение для UIView
  • Нижнее ограничение на UIView
  • Трейлинг-ограничение для UIView

шаг 3: Затем выберите трейлинг-ограничение IUlabel и выберите опцию редактирования, а затем выберите константу и выберите параметр moreThanEqual.

шаг 4: установить numberofline = 0 метки

шаг 5: Добавьте этот код в viewDidLoad()

yourtableview.estimatedRowHeight = 80.0
yourtableview.rowHeight = UITableViewAutomaticDimension
9
Brijesh Shiroya

Swift 4.2 . Как упоминалось выше, вы можете установить свойство объекта 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
      }
    }
1
GSK