将子视图添加到collectionview cell jsqmessagesviewcontroller

时间:2017-07-13 05:16:32

标签: ios swift swift3 jsqmessagesviewcontroller

我正在尝试为我的collectionView(JSQMessagesViewController)的每个单元格(消息)添加一个子视图,以显示我的消息的时间,如下所示:

enter image description here

这是我的代码:

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个标签:

enter image description here

为什么有2个标签?如何将此标签添加到我的消息的右下角?提前谢谢!

2 个答案:

答案 0 :(得分:1)

检查JSQMessagesCollectionViewCellIncoming.nibJSQMessagesCollectionViewCellIncoming.nib并根据需要调整Cell bottom label,使其看起来像您的设计。调整Autolayout约束并完成。

enter image description here

答案 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:或者您可以尝试在返回单元格之前在最后一行设置框架。