根据条件添加约束的行为异常

时间:2019-06-14 14:38:06

标签: swift constraints uicollectionviewcell

我正在为两个人之间的对话做准备。我在自定义单元格中使用了UICollectionView并使用了一个标志,基于该标志我决定了消息应该向左对齐还是向右对齐。如果我仅使用单个对齐方向,则约束将正常工作,甚至在基于条件的对齐中,约束也将正常运行,除非UICollectionView中的消息数少于四个。所以我知道约束没有错。但是,一旦添加第四条消息,先前单元格内容和单元格的对齐方式和顺序就会受到干扰。随附的屏幕截图显示了问题所在。

correct behaviour with 3 or less messages

wrong behaviour when 4 or more messages added

var avatarHorizontal = NSLayoutConstraint(item: messageCell.avatarImageView,
                                                      attribute: .leading,
                                                      relatedBy: .equal,
                                                      toItem: cell,
                                                      attribute: .leading,
                                                      multiplier: 1,
                                                      constant: 7)
var messageTextContainerHorizontal = NSLayoutConstraint(item: messageCell.messageTextContainer,
                                                                    attribute: .leading,
                                                                    relatedBy: .equal,
                                                                    toItem: messageCell.avatarImageView,
                                                                    attribute: .trailing,
                                                                    multiplier: 1,
                                                                    constant: 10)

if isCellFromUser {
    avatarHorizontal = NSLayoutConstraint(item: messageCell.avatarImageView,
                                                       attribute: .trailing,
                                                       relatedBy: .equal,
                                                       toItem: cell,
                                                       attribute: .trailing,
                                                       multiplier: 1,
                                                       constant: -16)
    messageTextContainerHorizontal = NSLayoutConstraint(item: messageCell.messageTextContainer,
                                                                     attribute: .trailing,
                                                                     relatedBy: .equal,
                                                                     toItem: messageCell.avatarImageView,
                                                                     attribute: .leading,
                                                                     multiplier: 1,
                                                                     constant: -10)
}

更新1: 我尝试了@Sh_Khan的建议,但这从集合视图的第一个单元格开始出现问题。

我什至尝试了以下代码,但仍以我以前遇到的原始形式保留了该问题:

if isCellFromUser {
    cell?.addConstraints([avatarRightAligned, messageTextContainerRightAligned])
} else {
    cell?.addConstraints([avatarLeftAligned, messageTextContainerLeftAligned])
}

因此,我注意到了一种趋势,即一旦引入if/else语句,无论我将引用变量重新用于约束对象的条件分配还是有条件地添加约束(已经声明了单独的引用),都会产生问题。约束对象的变量)。

更新2: 因此,事实证明我必须在init方法中而不是在cellForRowAt方法中添加所有约束,然后激活和停用cellForRowAt内部的相关约束。感谢@Sh_Khan抓住并提供了解决方案。现在,出现了另一个问题,就是我必须根据完全相同的条件来更改背景色和前景色,那么对此有什么解决方案?

更新3: 我为 UPDATE 2 here

中描述的问题添加了一个单独的问题

1 个答案:

答案 0 :(得分:0)

  

它甚至可以在基于条件的对齐方式下正常工作,除非UICollectionView中的消息数少于四个。

这是由于收集单元出队而发生的,因此当第四个单元出现时,它可能具有左/右约束对齐方式,并且您的代码尝试将其设置为相反,从而发生冲突

您可以做的是创建2个约束并将其设置在init

var leftCon,rightCon:NSLayoutConstraint!

然后根据cellForRowAt内的消息对齐方式与他们一起玩

leftCon.isActive = isLeftAligned
rightCon.isActive = !isLeftAligned