Swift 在聊天室中显示系统消息

Swift 在聊天室中显示系统消息,swift,xcode,chat,messagekit,Swift,Xcode,Chat,Messagekit,我正在努力研究如何在聊天室中显示系统消息。目前,我已经使用Swift中的MessageKit构建了聊天室,并完成了整个UI。我想要的是,当我点击右上角的红色按钮时,聊天室会自动显示一条系统消息“按钮被点击”,如下图所示。如果有人能帮忙,非常感谢 这个答案可能有点晚,但解决方法很简单。您只需创建一个自定义单元格,并使用messages view controller数据源对其进行配置 有一种方法,你可以在正式回购协议的基础上寻求帮助,帮助你在回购协议的同时做些什么 下面是一些演示代码(由于我引用了

我正在努力研究如何在聊天室中显示系统消息。目前,我已经使用Swift中的MessageKit构建了聊天室,并完成了整个UI。我想要的是,当我点击右上角的红色按钮时,聊天室会自动显示一条系统消息“按钮被点击”,如下图所示。如果有人能帮忙,非常感谢


这个答案可能有点晚,但解决方法很简单。您只需创建一个自定义单元格,并使用messages view controller数据源对其进行配置

有一种方法,你可以在正式回购协议的基础上寻求帮助,帮助你在回购协议的同时做些什么

下面是一些演示代码(由于我引用了一些自定义UIView子类,您将无法复制和粘贴此代码)

首先,创建您的
UICollectionViewCell

class SystemMessageCell:CollectionCell{
lazy var messageText=Label()
.variant(.正则(.small))
.颜色(.灰色)
.align(.center)
覆盖函数设置视图(){
addSubview(messageText)
}
覆盖函数设置约束(){
messageText.snp.makeConstraints{$0.edges.equalToSuperview()}
}
覆盖函数更新(){
guard let item=项目else{return}
切换项。种类{
案例。定制(出租类):
guard let kind=kind as?ChatMessageViewModel.kind else{return}
开关类{
case.system(let systemMessage):
messageText.text=systemMessage
}
违约:
打破
}
}
}
其次,您需要创建两个单独的文件。 一个是尺寸计算器,另一个是自定义流布局

class SystemMessageSizeCalculator:MessageSizeCalculator{
重写func messageContainerSize(对于message:MessageType)->CGSize{
//只需返回一个固定高度。
返回CGSize(宽度:UIScreen.main.bounds.width,高度:20)
}
}
class SystemMessageFlowLayout:MessagesCollectionViewFlowLayout{
惰性开放变量sizeCalculator=SystemMessageSizeCalculator(布局:self)
重写open func cellSizeCalculatorForItem(位于indexPath:indexPath)->CellSizeCalculator{
让message=messagesDataSource.messageForItem(位于:indepath,在:messagescolectionview中)
如果case.custom=message.kind{
返回尺寸计算器
}
返回super.cellsizecalculatorItem(at:indexPath);
}
}
最后,将其连接到MessagesViewController中,如下所示:

class ChatViewController:MessagesViewController{
重写func viewDidLoad(){
messagesCollectionView=messagesCollectionView(帧:.0,collectionViewLayout:SystemMessageFlowLayout())
super.viewDidLoad()
messagesCollectionView.register(SystemMessageCell.self)
}
//标记:-自定义单元格
重写打开的func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UICollectionViewCell{
guard let messagesDataSource=messagesCollectionView.messagesDataSource else{
fatalError(“Ouch.nil消息数据源”)
}
让message=messagesDataSource.messageForItem(位于:indepath,在:messagescolectionview中)
如果case.custom=message.kind{
let cell=messagescolectionview.dequeueReusableCell(SystemMessageCell.self,for:indexath)
cell.item=消息
返回单元
}
返回super.collectionView(collectionView,cellForItemAt:indexPath)
}
}
最终结果如下:


这个答案可能有点晚,但解决方法很简单。您只需创建一个自定义单元格,并使用messages view controller数据源对其进行配置

有一种方法,你可以在正式回购协议的基础上寻求帮助,帮助你在回购协议的同时做些什么

下面是一些演示代码(由于我引用了一些自定义UIView子类,您将无法复制和粘贴此代码)

首先,创建您的
UICollectionViewCell

class SystemMessageCell:CollectionCell{
lazy var messageText=Label()
.variant(.正则(.small))
.颜色(.灰色)
.align(.center)
覆盖函数设置视图(){
addSubview(messageText)
}
覆盖函数设置约束(){
messageText.snp.makeConstraints{$0.edges.equalToSuperview()}
}
覆盖函数更新(){
guard let item=项目else{return}
切换项。种类{
案例。定制(出租类):
guard let kind=kind as?ChatMessageViewModel.kind else{return}
开关类{
case.system(let systemMessage):
messageText.text=systemMessage
}
违约:
打破
}
}
}
其次,您需要创建两个单独的文件。 一个是尺寸计算器,另一个是自定义流布局

class SystemMessageSizeCalculator:MessageSizeCalculator{
重写func messageContainerSize(对于message:MessageType)->CGSize{
//只需返回一个固定高度。
返回CGSize(宽度:UIScreen.main.bounds.width,高度:20)
}
}
class SystemMessageFlowLayout:MessagesCollectionViewFlowLayout{
惰性开放变量sizeCalculator=SystemMessageSizeCalculator(布局:self)
重写open func cellSizeCalculatorForItem(位于indexPath:indexPath)->CellSizeCalculator{
让message=messagesDataSource.messageForItem(位于:indepath,在:messagescolectionview中)
如果case.custom=message.kind{
返回尺寸计算器
}
返回super.cellsizecalculatorItem(at:indexPath);
}
}
最后,将其连接到MessagesViewController中,如下所示:

class ChatViewController:MessagesViewController{
重写func viewDidLoad(){
messagesCollectionView=messagesCollectionView(帧:.0,collectionViewLayout:SystemMessageFlowLayout())
super.viewDidLoad()
messagesCollectionView.register(SystemMessageCell.self)
}
//标记:-自定义单元格
重写open func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UIColl