получить высоту пользовательской ячейки в UITableViewCell - PullRequest
0 голосов
/ 16 ноября 2018

Я создаю приложение, похожее на пузырьковый чат.Я создал пользовательские функции для получения и отправки пузырьковых чатов.

После их создания я добавил их в ячейки, созданные с помощью UITableView.

Однако я не могу установить высоту ячейки в зависимости отвысота самой пользовательской ячейки.

Например, часть переданного текста может быть длиннее, чем предыдущий.

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

Пожалуйста, помогите!

Это мои функции просмотра таблицы

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arrMsg.count
}

// second
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return 100
}

// lastly created
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for:indexPath)

    if arrMsg[indexPath.row]["type"] as! String == "outgoing" {
        cell.contentView.addSubview(createOutGoingBubble(msg: arrMsg[indexPath.row]["message"] as! String))
    }
    if arrMsg[indexPath.row]["type"] as! String == "incoming" {
        cell.contentView.addSubview(createIncomingBubble(mymsg: arrMsg[indexPath.row]["message"] as! String))
    }
    return cell
}

Вот как это выглядит в настоящее время

Как установить высоту ячейки в соответствии с пользовательским пузырем, созданным внутри функции heightforrowat?

Вероятно, используя строку, чтобы найти высоту и вернуть ее:

arrMsg[indexPath.row]["message"] as! String == "outgoing" 

** Это моя функция для создания пользовательских пузырьковых чатов, которые будут добавлены в ячейку tableview

func createOutGoingBubble(msg:String) -> UIView {

    let subV = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))

    let label = UILabel()
    label.numberOfLines = 0
    label.font = UIFont.systemFont(ofSize: 18)
    label.textColor = .white
    label.text = msg

    let constraintRect = CGSize(width: 0.66 * view.frame.width,
                                height: .greatestFiniteMagnitude)
    let boundingBox = msg.boundingRect(with: constraintRect,
                                       options: .usesLineFragmentOrigin,
                                       attributes: [.font: label.font],
                                       context: nil)
    label.frame.size = CGSize(width: ceil(boundingBox.width),
                              height: ceil(boundingBox.height))

    let bubbleSize = CGSize(width: label.frame.width + 28,
                            height: label.frame.height + 20)

    let outgoingMessageView = UIImageView(frame:
        CGRect(x: view.frame.width - bubbleSize.width - 20,
               y: bubbleSize.height - 25,
               width: bubbleSize.width,
               height: bubbleSize.height))

    let bubbleImage = UIImage(named: "outgoing")?
        .resizableImage(withCapInsets: UIEdgeInsets(top: 17, left: 21, bottom: 17, right: 21),
                        resizingMode: .stretch)
        .withRenderingMode(UIImage.RenderingMode.alwaysTemplate)

    outgoingMessageView.image = bubbleImage
    outgoingMessageView.tintColor = UIColor(red: 0.40 , green: 0.71, blue: 1.00, alpha: 1)

    subV.addSubview(outgoingMessageView)

    label.center = outgoingMessageView.center

    subV.addSubview(label)

    return subV
}

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

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

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension

}

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

        let cell:ChatSenderTableViewCell = (tableView.dequeueReusableCell(withIdentifier: "ChatSenderTableViewCell", for: indexPath) as? ChatSenderTableViewCell)!

        cell.LabelChatMessage.text = "Your Message"
        cell.LabelChatMessage.numberOfLines = 0
        cell.LabelChatMessage.sizeToFit()

        return cell

}

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

0 голосов
/ 16 ноября 2018

Вы можете попробовать это:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    guard let cell = tableView.cellForRow(at: indexPath) else { return 0 }
    return cell.intrinsicContentSize.height
}

intrinsicContentSize - это естественный размер для принимающего представления, учитывающий только свойства самого представления.

0 голосов
/ 16 ноября 2018

Используйте метку внутри поля зрения и используйте поля сверху и снизу по своему желанию.Также вам нужно сделать 0 строк в UIlabel.Вы можете сделать это, используя label.numberoflines = 0. Кроме того, вам нужно добавить следующий код, чтобы изменить высоту строки в соответствии с текстом внутри нее.

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...