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

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

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

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

【问题讨论】:

    标签: ios swift chat messagekit


    【解决方案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 的单元格

    MessageContentCellMessageKit 用来在聊天气泡中显示您的消息的类

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 2021-07-28
      相关资源
      最近更新 更多