我正在尝试为我的collectionView(JSQMessagesViewController
)的每个单元格(消息)添加一个子视图,以显示我的消息的时间,如下所示:
这是我的代码:
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell
let message = messages[indexPath.item]
let timeLabel = UILabel()
timeLabel.frame = cell.textView.frame
timeLabel.text = "abc"
timeLabel.textColor = .blue
cell.addSubview(timeLabel)
if message.senderId == senderId { // 1
cell.textView?.textColor = UIColor.black // 3
cell.avatarImageView.image = self.avatars.0.image
cell.avatarImageView.layer.cornerRadius = cell.avatarImageView.frame.size.height / 2
cell.avatarImageView.clipsToBounds = true
} else {
cell.textView?.textColor = UIColor.black // 2
cell.avatarImageView.image = self.avatars.1.image
cell.avatarImageView.layer.cornerRadius = cell.avatarImageView.frame.size.height / 2
cell.avatarImageView.clipsToBounds = true
}
return cell
}
但它增加了2个标签:
为什么有2个标签?如何将此标签添加到我的消息的右下角?提前谢谢!
答案 0 :(得分:1)
检查JSQMessagesCollectionViewCellIncoming.nib
和JSQMessagesCollectionViewCellIncoming.nib
并根据需要调整Cell bottom label
,使其看起来像您的设计。调整Autolayout约束并完成。
答案 1 :(得分:1)
问题1
基本上,您每次都会创建新的标签实例。
let timeLabel = UILabel()
timeLabel.frame = cell.textView.frame
timeLabel.text = "abc"
timeLabel.textColor = .blue
由于重用的概念,单元格将在下次重用所有内容。因此,当您第一次添加timeLabel
子视图时,可以在下次使用时再次使用。如果标签已经存在,那么您再次添加它let timeLabel = UILabel()
,并且每次都会放置一个新实例。
解决方案1
您必须添加一次子视图并使用标记重复使用。
在类级声明let timeLabel :UILabel?
表示声明所有变量的位置,并在cellForItemAt
atIndexPath
中检查其引用
if timeLabel == nil {
timeLabel = UILabel()
timeLabel.frame = cell.textView.frame
timeLabel.text = "abc"
timeLabel.textColor = .blue
timeLabel.tag = 766
cell.addSubview(timeLabel)
}
最后通过cellForItemAt
atIndexPath
问题2
这不在右下方,因为在awakeFromNib()
JSQMessagesCollectionViewCell
之后,这不是添加意味着标签在setupLayout之前添加。
解决方案2
A:您必须手动添加约束。
B:或者您可以尝试在返回单元格之前在最后一行设置框架。