因此,我试图制作一个 chatMessageCell ,但有时{strong} cellForRowAt
部分中的更改约束会弄乱布局
单元格:
通常设置为0,但是当选择单元格时,它将更改为30
其高度取决于文本的长度。如果为零,则TextView被隐藏
如果邮件带有附件,则可以看到堆栈视图以及图像(高度为150)
代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var chatMessage = ChatStore.shared.chatRoom(id: currentChatRoomId).messages[indexPath.row]
var cell = tableView.dequeueReusableCell(withIdentifier: "ChatMessageCell", for: indexPath) as! ChatMessageCell
cell.timeLabel.text = "2019/02/12"
if chatMessage.message == "" {
cell.messageTextView.isHidden = true
} else {
cell.messageTextView.isHidden = false
}
cell.messageTextView.text = chatMessage.message
if (currentSelectedIndexPath != indexPath) {
cell.bubbleView.backgroundColor = appColors.chatMessage
// Time label hidden
cell.timeLabelHeightConstraint.constant = 0
} else {
cell.bubbleView.backgroundColor = appColors.chatMessageSelected
// Time label visible
cell.timeLabelHeightConstraint.constant = 30
}
if chatMessage.attachments.count > 0 {
cell.attachmentsPreviewStackView.isHidden = false
cell.attachmentsPreviewStackView.subviews.forEach({ $0.removeFromSuperview() })
for attachment in chatMessage.attachments {
if let attachmentPreviewView = Bundle.main.loadNibNamed("AttachmentPreviewView", owner: self, options: nil)?.first as? AttachmentPreviewView {
attachmentPreviewView.imageView.image = UIImage(named: "TEST_IMAGE")
cell.attachmentsPreviewStackView.addArrangedSubview(attachmentPreviewView)
}
}
} else {
// No attachments, hide
cell.attachmentsPreviewStackView.isHidden = true
cell.attachmentsPreviewStackView.subviews.forEach({ $0.removeFromSuperview() })
}
cell.delegate2 = self
return cell
}
问题: 当用户关闭键盘时,某些单元格的布局就会混乱。
只有在关闭键盘后才会发生这种情况,并且只有在我用insertRows(at: )
添加新行之后。
如果正常滚动或重新加载tableView,就不会出现这样的问题。
视频:https://www.youtube.com/watch?v=uMmQyN3SM5g&feature=youtu.be (从21秒开始)
我的问题是:这背后的可能原因是什么?
当我更改约束 / 在cellForRowAt
部分的stackView中隐藏视图时,我应该调用.layoutIfNeeded()
吗?