好几天以来,我一直在努力解决这个问题,不知道是什么原因造成的。 collectionview正确加载了第一组单元格,但是由于某种原因,所有随后的单元格都“填充”到collectionView的宽度中。这是正在发生的事情的gif:
我可以肯定这是一个布局问题,因为它也会干扰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()
}
}