UILabel не ломает строки в UITableViewCell - PullRequest
0 голосов
/ 04 февраля 2019

Я создаю приложение с интерфейсом, похожим на мессенджер.
Я использую tableView для достижения этой цели.Каждая ячейка содержит UIView - пузырь сообщения и UILabel - сообщение, вложенное в UIView.
Он отлично работает с текстами небольшого размера, но по какой-то причине, когда UILabel должен разбивать строки, он этого не делает, и все это в одну строку.Количество строк установлено на ноль.

Это мой класс обработки сообщений:

    func commonInit() {

    print(MessageView.frame.height)
    MessageView.clipsToBounds = true
    MessageView.layer.cornerRadius = 15
    myCellLabel.numberOfLines = 0
    let bubbleSize = CGSize(width: self.myCellLabel.frame.width + 28, height: self.myCellLabel.frame.height + 20)
    print(bubbleSize.height)
    MessageView.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: bubbleSize.width, height: bubbleSize.height)


    if reuseIdentifier! == "Request" {
        MessageView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner, .layerMinXMaxYCorner]
        MessageView.backgroundColor = UIColor(red: 0, green: 122/255, blue: 1.0, alpha: 1.0)
    } else  {
        MessageView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner, .layerMaxXMaxYCorner]
        MessageView.backgroundColor = UIColor.lightGray
    }


}

Функция вызова ячейки:

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

    if queryCounter % 2 == 0 && indexPath.row % 2 == 0{
        cellReuseIdentifier = "Answer"

    } else {
        cellReuseIdentifier = "Request"
    }

    let cell:MessageCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MessageCell
    cell.myCellLabel.textColor = UIColor.white
    cell.myCellLabel.text = self.messages[indexPath.row]
    let height = cell.myCellLabel.text!.height(withConstrainedWidth: cell.myCellLabel.frame.width, font: cell.myCellLabel.font)
    print(height)
    cell.contentView.transform = CGAffineTransform(scaleX: 1, y: -1)

    return cell
}

Переменная высоты вычисляется на основепо размеру текста.Это показывает, что размер текста рассчитывается нормально - с учетом разрыва строки.Я не смог изменить высоту ячейки на основе этого расчета - ничего, что я пробовал, не работает.Я думаю, что это может быть проблемой с ограничениями.
Мои ограничения: enter image description here

enter image description here

Как сделать разрыв строк?Пожалуйста, помогите.

РЕДАКТИРОВАТЬ: я просто заметил, что MessageView.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: bubbleSize.width, height: bubbleSize.height) не влияет на то, что когда-либо на пузыри сообщения.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Попробуйте найти высоту надписи на основе ширины надписи и шрифта текста, а затем установите ограничение высоты надписи на это.

extension String {
    func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)

        return ceil(boundingBox.height)
    }
}

примерно так:

let textHeight = yourtext.height(withConstrainedWidth: yourlabel.frame.width, font: font)
yourLabel.heightAnchor.constraint(equalToConstant: textHeight).isActive = true
0 голосов
/ 05 февраля 2019

После нескольких часов попыток все мне удалось исправить.Проблема была с ограничениями.
1. Как вы можете видеть на этом старом макете.UIView был ограничен везде, кроме левого -> вот где текст идет.enter image description here

Метод commonInit () UITableViewCell был вызван перед инициализацией любого текста.Это не хорошо, потому что все изменения размера ячейки основаны на тексте, который еще не был передан в ячейку -> Переместить метод после инициализации ячейки.

    let cell:MessageCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MessageCell
cell.myCellLabel.text = self.messages[indexPath.row]

//Before calling commonInit() we need to adjust the cell height. 
let height = cell.myCellLabel.text!.heightForView(text: cell.myCellLabel.text!, font: cell.myCellLabel.font, width: self.view.frame.width / 2)

// Then we set the width of the UILabel for it to break lines at 26 characters
if cell.myCellLabel.text!.count > 25 {
    tableView.rowHeight = height + 20
    cell.myCellLabel.widthAnchor.constraint(equalToConstant: cell.frame.width / 2).isActive = true
    cell.updateConstraints()

}
// Calling commonInit() after adjustments 
cell.commonInit()

cell.contentView.transform = CGAffineTransform(scaleX: 1, y: -1)

return cell

Затем нам нужно обновитьограничения, чтобы UIView и UILabel изменяли размеры с высотой ячейки.enter image description here

enter image description here

Готово.Теперь это работает по мере необходимости.Спасибо за все предложения!enter image description here
0 голосов
/ 04 февраля 2019

Настройка фрейма при использовании автоматического размещения не будет работать.

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

  1. Забыл установить автоматическую высоту для ваших ячеек (расширение ячейки в раскадровке вручную переопределит этот параметр)
  2. Для просмотра таблицы также необходимо оценить высоту, иногда для правильной работы
  3. Иногда вам нужно позвонить setNeedsLayout после добавления содержимого в ячейку

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...