ios - 获取 UITableViewCell 中自定义单元格的高度

标签 ios swift uitableview

我正在创建一个类似应用程序的气泡聊天。我为接收和发送气泡聊天创建了自定义函数。

创建它们之后,我将它们添加到我使用 UITableView 创建的单元格中。

但是,我无法设置单元格的高度,具体取决于自定义单元格本身的高度。

例如,传入的某些文本可能比之前的文本更长。

因此我似乎无法根据自定义气泡聊天高度设置每个单元格。

请帮忙!

这是我的表格 View 函数

 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
}

This is how it looks currently

如何根据在 heightforrowat 函数中创建的自定义气泡设置单元格的高度?

大概是用直线求高度返回:

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

**这是我创建要添加到 tableviewcell 中的自定义气泡聊天的功能

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
}

提前致谢!

最佳答案

您可以使用 Autolayout 进行相同的操作,并从所有编码部分中解脱出来。只需设置与单元格相关联的内部 View 的约束,然后右击以下代码。

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 来创建类似气泡的效果,其中包含用于发送或接收消息的标签。

关于ios - 获取 UITableViewCell 中自定义单元格的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53330774/

相关文章:

c++ - 是否有可能直接将 C++ 与 Metal API 一起使用

ios - 从缓冲区创建的 NSData 创建 UIImage 返回 nil?

ios - 如何以编程方式隐藏键盘剪贴板?

ios - 浏览 UITableView 中的文本字段

ios - 如何使用滑动 Action 移动带有动画的 tableViewCell 中的单元格

ios - Controller 或 View 类中的 UIScroll 回调

ios - 设置导航栏字体和大小时遇到​​问题

ios - 如何通过 iOS 通知中心发送和接收 JSON?

ios Firebase Dynamic Link 不打开已安装的应用程序

ios - Swift - 如何将保存的音频文件对话转换为文本?