如何使用 MessageKit 创建自定义单元格?

Posted

技术标签:

【中文标题】如何使用 MessageKit 创建自定义单元格?【英文标题】:How to create custom cell with MessageKit? 【发布时间】:2019-07-09 18:15:36 【问题描述】:

我想使用MessageKit创建以下自定义聊天气泡

我在提供的示例中使用CustomCell 示例。但这不会根据发件人类型添加聊天气泡背景和定位。

如何创建具有相同聊天气泡背景的自定义单元格?

【问题讨论】:

【参考方案1】:

使用MessageKit 创建自定义单元格

要创建自定义单元格,您必须创建一个继承自 UICollectionViewCell 的单元格。 一旦你有了你的细胞,你需要告诉你的细胞的大小。怎么办?

您必须创建一个继承自 MessageSizeCalculatorCellSizeCalculator 的类才能创建自定义单元大小计算器

您必须创建一个继承自 MessagesCollectionViewFlowLayout 的类,并添加自定义大小计算器,以计算单元格的大小。

你必须重写两个方法来实现:

messageSizeCalculators() 添加您的自定义单元大小计算器 cellSizeCalculatorForItem(at indexPath: IndexPath) 选择您将使用自定义单元格计算器的单元格

你可以从 master 分支看到这个例子:

open class CustomMessagesFlowLayout: MessagesCollectionViewFlowLayout 

    open lazy var customMessageSizeCalculator = CustomMessageSizeCalculator(layout: self)

    open override func cellSizeCalculatorForItem(at indexPath: IndexPath) -> CellSizeCalculator 
        let message = messagesDataSource.messageForItem(at: indexPath, in: messagesCollectionView)
        if case .custom = message.kind 
            return customMessageSizeCalculator
        
        return super.cellSizeCalculatorForItem(at: indexPath)
    

    open override func messageSizeCalculators() -> [MessageSizeCalculator] 
        var superCalculators = super.messageSizeCalculators()
        // Append any of your custom `MessageSizeCalculator` if you wish for the convenience
        // functions to work such as `setMessageIncoming...` or `setMessageOutgoing...`
        superCalculators.append(customMessageSizeCalculator)
        return superCalculators
    


open class CustomMessageSizeCalculator: MessageSizeCalculator 

    public override init(layout: MessagesCollectionViewFlowLayout? = nil) 
        super.init()
        self.layout = layout
    

    open override func sizeForItem(at indexPath: IndexPath) -> CGSize 
        guard let layout = layout else  return .zero 
        let collectionViewWidth = layout.collectionView?.bounds.width ?? 0
        let contentInset = layout.collectionView?.contentInset ?? .zero
        let inset = layout.sectionInset.left + layout.sectionInset.right + contentInset.left + contentInset.right
        return CGSize(width: collectionViewWidth - inset, height: 44)
    



你可以看看这个issue on GitHub

使用 MessageKit 创建基于 MessageBubble 的单元格

MessageContentCell 是 MessageKit 用来在聊天气泡中显示您的消息的类

你可以通过扩展这个类来创建一个单元格:

import MessageKit
import UIKit

open class CustomCell: MessageContentCell 

     open override func configure(with message: MessageType, at indexPath: IndexPath, and messagesCollectionView: MessagesCollectionView) 
         super.configure(with: message, at: indexPath, and: messagesCollectionView)


      

     override open func layoutAccessoryView(with attributes: MessagesCollectionViewLayoutAttributes) 
         // Accessory view is always on the opposite side of avatar
     


  

如果你想扩展其他Cells

【讨论】:

API 错误:<_uikbcompatinputview: layer="<CALayer:">> 返回 0 宽度,假设 UIViewNoIntrinsicMetric.... 在模拟器中打开键盘时出现此错误。【参考方案2】:

他们目前已更新其文档以包括如何添加自定义单元格。在这里检查 Read more about custom cells

【讨论】:

以上是关于如何使用 MessageKit 创建自定义单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 2 个或更多自定义单元格创建自定义 UICollectionView?

如何使用自定义 JTable 单元格编辑器和单元格渲染器

如何将 SwipeCellKit 的自定义滑动功能用于从 .xib 文件创建的自定义单元格?

如何使用按钮创建自定义集合视图?

在MessageKit中轻按以放大图像视图-Swift

如何在 TableView 中调整自定义单元格的大小?