Как автоматически изменить размер UITableViewCell, когда я хочу добавить динамический текст

Я настраиваю UITableView с несколькими ячейками. Когда я удерживаю ячейку, появляется меню, и я могу добавить комментарий/текст в свою ячейку. Я хочу, чтобы не отображалось пустое пространство меток комментариев, если пользователь не вставляет комментарий. Но если пользователь вставит комментарий, тогда появится этот ярлык и отобразится весь вставленный комментарий. Возможно ли это сделать без жесткого кода высоты ячейки? Потому что это приложение будет работать на нескольких устройствах, и экран на каждом из них будет разным.

Я уже безуспешно пытался использовать авто-макет, используя эти строки кода в viewDidLoad:

questionsTableView.rowHeight = UITableView.automaticDimension
questionsTableView.estimatedRowHeight = 390

Также я пытался использовать questionsTableView.beginUpdates до добавления комментария к метке и questionsTableView.endUpdates после того, как комментарий был назначен метке, но тоже не работает.

Мне не удается отобразить ячейку таким образом, когда пользователь запускает приложение, и если пользователь добавляет какой-либо комментарий, затем расширяет ячейку и отображает метку: Как автоматически изменить размер UITableViewCell, когда я хочу добавить динамический текст

Вот мой код:

class MainVC: UIViewController {

    // Interface Links
    @IBOutlet weak var questionsTableView: UITableView!

    // Properties
    var imagePicker: UIImagePickerController!
    var firstCommentReceived = ""
    var secondCommentReceived = ""
    var images = [UIImage]()

    override func viewDidLoad() {
        super.viewDidLoad()

        questionsTableView.rowHeight = UITableView.automaticDimension
        questionsTableView.estimatedRowHeight = 390
    }
}

extension MainVC: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 2
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! MainCell
        cell.delegate = self
        cell.configCell()
        if !firstCommentReceived.isEmpty{
            cell.firstCommentLabel.text = firstCommentReceived
        }
        if !secondCommentReceived.isEmpty{
            cell.secondCommentLabel.text = secondCommentReceived
        }
        if !images.isEmpty{
            cell.selectedImageView.image = images[0]
        }
        return cell
    }

    // Set the height of each row from UITableView
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        return 390 // size of the maximum height of the cell if the user add comments and images. This size should be dynamic not hardcoded.
    }
}

Здесь я создал небольшой пример GitHub с моей проблемой: https://github.com/tygruletz/sendDataFromCellToController

Спасибо, если вы это читаете!

Создал запрос на включение в ваш репозиторий.

Sharad Chauhan 08.04.2019 13:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Что ж, я просмотрел ваш проект и обнаружил, что у вас проблемы с макетом ^^"

1- Вам нужно установить макет ячейки сверху вниз, и я вижу, что вы пропустили это до последнего элемента в ячейке, который является изображением

2- Вам нужно найти динамические метки, которые вы должны использовать, например, в своем. Это были комментарии 1 и 2, которые имеют приоритет.

3- Наконец я обнаружил, что вы делаете высоту ячейки статической, и в вашем случае она должна быть динамической.

// Установить высоту каждой строки из UITableView

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension // in your app it was 390
}

если вы хотите посмотреть, это редактирование кода проекта

https://ufile.io/plddi

Удачи ;)

И как я могу удалить это пространство, когда приложение работает? imgur.com/DFXYoJ1

Flo 08.04.2019 13:49

хммм, для этого есть много хитростей, например, вы можете контролировать константу высоты для каждого комментария или правильный способ - использовать другие ячейки пера: D

Ahmed Safadi 08.04.2019 13:53

Я установил высоту метки на 24 пикселя, потому что получал предупреждения в консоли. Если я удалю высоту для меток, то это сработает, но у меня много предупреждений. Вот предупреждения: imgur.com/a/G3mVNsV

Flo 08.04.2019 13:56

дайте мне немного времени, я исправлю это для вас и покажу экран для этого

Ahmed Safadi 08.04.2019 14:04

Вы хотите, чтобы это было так, верно? - imgur.com/a/c8zTzDJ - вы можете скачать проект и принять ответ, если он сделан для вас (ufile.io/wz1om)

Ahmed Safadi 08.04.2019 14:30

Удивительно. Я только что узнал, что могу связать ограничения из представления со своим кодом и управлять значением оттуда. Это так здорово! Большое спасибо Ахмед!

Flo 08.04.2019 14:42

<3 Никаких проблем в любое время <3

Ahmed Safadi 08.04.2019 17:26

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

return UITableView.automaticDimension
//or you can remove this method

И можно ли удалить это пространство, когда у меня ничего нет на этом ярлыке? imgur.com/DFXYoJ1 Я установил высоту метки на 24 пикселя, потому что в консоли появлялись предупреждения. Если я удалю высоту для меток, тогда я работаю, но у меня много предупреждений. Вот предупреждения: imgur.com/ka5mkKR

Flo 08.04.2019 13:51

Я думаю просто оставить их пустыми. Ячейка Tableview автоматически устанавливает высоту

Jon Striker 08.04.2019 14:01

если я не ошибаюсь, ты хочешь этого? drive.google.com/file/d/1cCI7_IEpfFgqvnCKbKOgH4DZKXcXRgNt/…

Jon Striker 08.04.2019 14:06

да. Кроме того, UIImageView не будет, если пользователь не сделает снимок с помощью камеры. Если пользователь добавит комментарий/тег/фото, чтобы показать, что Labels/ImageView.

Flo 08.04.2019 14:09

хорошо. Я только что удалил ваш фиксированный текст с ярлыков. Вам нужно сделать ограничение высоты IBoutlet, а затем установить его на 0. когда пользователь добавит любой комментарий, у вас есть обратный вызов вашего ограничения набора предупреждений с любой высотой, которую вы хотите.

Jon Striker 08.04.2019 14:12

хорошо. Я только что удалил ваш фиксированный текст с ярлыков. Вам нужно сделать ограничение по высоте IBoutlet в вашем классе ячеек, а затем установить его с помощью 0. когда пользователь добавит любой комментарий, который у вас есть, просто перезагрузите табличное представление и проверьте, не является ли переменная строки комментария пустой ограничением набора предупреждений с любой высотой, которую вы хотите.

Jon Striker 08.04.2019 14:21

Другие вопросы по теме