显示单元格时UICollectionView中的单元格行为异常

时间:2019-05-23 00:07:56

标签: ios swift uicollectionview

好几天以来,我一直在努力解决这个问题,不知道是什么原因造成的。 collectionview正确加载了第一组单元格,但是由于某种原因,所有随后的单元格都“填充”到collectionView的宽度中。这是正在发生的事情的gif:

enter image description here

我可以肯定这是一个布局问题,因为它也会干扰imageView的拐角半径,并且我尝试在元素被隐藏/显示/更新但无济于事的情况下运行layoutIfNeeded()。 >

TestController.swift

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return chats.count
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width, height: 75)
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TestCell", for: indexPath) as! TestCell

        let chat = chats[indexPath.item]

        cell.clearData()
        cell.setChat(chat)
        cell.layoutIfNeeded()

        return cell
    }

TestCell.swift

import UIKit
import ActiveLabel

class TestCell: UICollectionViewCell {

    // MARK: - Outlets
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var createdLabel: UILabel!
    @IBOutlet weak var messageLabel: ActiveLabel!
    @IBOutlet weak var timeLabel: UILabel!
    @IBOutlet weak var statusButton: UIButton!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var unreadView: UIView!

    // MARK: - Variables
    private var chat: Chat!

    // MARK: - Functions
    static func nib() -> UINib {
        return UINib(nibName: String(describing: self), bundle: Bundle(for: self))
    }


    func clearData() {
        titleLabel.text = nil
        createdLabel.text = nil
        messageLabel.text = nil
        timeLabel.text = nil
        statusButton.isHidden = true
    }

    func setupElements() {
        unreadView.isHidden = true
        unreadView.layer.cornerRadius = unreadView.frame.height/2
        unreadView.backgroundColor = Constants.Colors.primary
        unreadView.bezierPathBorder(.white, width: 3)

        imageView.image = nil
        imageView.layer.masksToBounds = true
        imageView.backgroundColor = Constants.Colors.gray1
        imageView.layer.cornerRadius = imageView.frame.height/2

        timeLabel.font = UIFont(name: "HelveticaNeue", size: 13)
        timeLabel.textColor = Constants.Colors.gray2

        titleLabel.font = Constants.Fonts.title
        titleLabel.textColor = Constants.Colors.text

        createdLabel.isHidden = true
        createdLabel.font = UIFont(name: "HelveticaNeue", size: 12)
        createdLabel.textColor = Constants.Colors.text

        messageLabel.textColor = Constants.Colors.gray2
        messageLabel.font = Constants.Fonts.title

        statusButton.imageView?.contentMode = .scaleAspectFit
        statusButton.titleLabel?.font = UIFont(name: "HelveticaNeue-Medium", size: 12)
        statusButton.tintColor = Constants.Colors.gray2
    }

    func setChat(_ chat: Chat) {
        self.chat = chat

        setupElements()

        if chat.lastMessage.sender.uid.count > 5 {
            // Handle read receipt
            statusButton.isHidden = false

            if chat.lastMessage.readReceipt != nil {
                self.statusButton.setImage(UIImage(named: "statusRead")?.withRenderingMode(.alwaysTemplate), for: .normal)
self.statusButton.tintColor = Constants.Colors.primary
            }else {
                self.statusButton.setImage(UIImage(named: "statusDelivered")?.withRenderingMode(.alwaysTemplate), for: .normal)
self.statusButton.tintColor =  Constants.Colors.gray2
            }            
        }else {
            statusButton.isHidden = true

            if chat.lastMessage.readReceipt == nil {
                unreadView.isHidden = false
                titleLabel.font = UIFont(name: "HelveticaNeue-Medium", size: 18)
                messageLabel.font = UIFont(name: "HelveticaNeue-Medium", size: 18)
                messageLabel.textColor = titleLabel.textColor
            }
        }

        titleLabel.text = "Title"
        messageLabel.text = chat.lastMessage.content
        timeLabel.text = chat.lastMessage.timestamp.timeAgoMini()
    }
}

0 个答案:

没有答案