swift - 再次推送 VC 后约束被打破
问题描述
当我弹出 VC 时,我的约束被打破了。我有表格视图,当我第一次推送表格视图时,约束工作得很好,但是在再次弹出和推送之后它们就坏了。第一张图片运行良好,但第二张图片坏了也许问题出在 didSet 中,在打破约束后 xcode 说要删除宽度,但 ui 会不好 这是我的单元格代码
var isIncoming: Bool! {
didSet {
bubbleBackgroundView.backgroundColor = isIncoming ? Constants.Color.inComingMessages : Constants.Color.outComingMessages
messageLabel.textColor = isIncoming ? .black : .white
if isIncoming {
bubbleBackgroundView.snp.makeConstraints { (make) in
make.leading.equalTo(16)
make.width.equalTo(180)
}
messageLabel.snp.makeConstraints { (make) in
make.leading.equalTo(16)
}
addSubview(inComingImgTail)
inComingImgTail.snp.makeConstraints { (make) in
make.trailing.equalTo(bubbleBackgroundView.snp.leading).offset(12)
make.top.equalTo(bubbleBackgroundView.snp.top).offset(1)
make.width.equalTo(15)
make.height.equalTo(36)
}
}
else if !isIncoming{
bubbleBackgroundView.snp.makeConstraints { (make) in
make.trailing.equalTo(self).offset(-16)
make.width.equalTo(180)
}
messageLabel.snp.makeConstraints { (make) in
make.leading.equalTo(16)
make.trailing.equalTo(-16)
}
addSubview(OutComingImgTail)
OutComingImgTail.snp.makeConstraints { (make) in
make.trailing.equalTo(bubbleBackgroundView.snp.trailing).offset(4)
make.top.equalTo(bubbleBackgroundView.snp.top).offset(1)
make.width.equalTo(15)
make.height.equalTo(36)
}
}
}
}
这是我的数据源和委托代码
extension ChatVC: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return ChatVC.messagesList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: MessagesCell.reuseIdentifier, for: indexPath) as! MessagesCell
let messages = ChatVC.messagesList[indexPath.row]
let sorted = ChatVC.messagesList.sorted { (first, second) -> Bool in
return first.pk < second.pk
}
cell.messagesLists = messages
cell.messageLabel.text = sorted[indexPath.row].text
if sorted[indexPath.row].from_user == userID {
cell.isIncoming = false
}
else if sorted[indexPath.row].from_user != userID {
cell.isIncoming = true
}
return cell
}
}
解决方案
每次都重复使用单元格,并且要将模式从 .sent 切换到 .received,您必须停用以前的约束。为两种状态添加两个约束数组,并停用前一个数组并激活新数组。在您的情况下,您只需附加约束,但不要删除它们
var receivedConstraints = [NSLayoutConstraint]()
var sentConstraints = [NSLayoutConstraint]()
...
final func changeCellMode(to mode: SNKMessage.Mode, didChangeMessageMode: (Bool) -> ()) {
if let _previousMode = previousMessageMode, _previousMode == mode {
didChangeMessageMode(false)
messageBackground.setNeedsDisplay()
return
}
didChangeMessageMode(true)
if mode == .outgoing {
NSLayoutConstraint.deactivate(receivedConstraints)
NSLayoutConstraint.activate(sentConstraints)
} else {
NSLayoutConstraint.deactivate(sentConstraints)
NSLayoutConstraint.activate(receivedConstraints)
}
messageBackground.messageMode = mode
previousMessageMode = mode
setNeedsLayout()
}
推荐阅读
- python - ImportError:无法导入名称“枚举”
- r - R:为什么合并会丢弃数据?如何为合并插入缺失值
- c# - 了解 .Net 任务执行中的上下文
- hyperledger-fabric - 无法使用结构节点 sdk 向多节点网络发送交易提案
- javafx - JavaFX:如何更改与 selectRange 对应的 TextArea 中文本的颜色
- amazon-web-services - AWS HTTPS 证书不适用于负载均衡器
- mysql - MySQL显示范围之间的所有日期虽然没有记录
- python - 我是否在 pandas df.tail() 中发现了错误或犯了错误?
- slack - 如何从 Slack 通知 Web 场景的触发器
- java - 如何在 Tomcat 上运行的 Spring REST 应用程序上找到未使用的端点?