Я делаю видение для разговора между двумя людьми.Я использовал UICollectionView
с пользовательской ячейкой и использовал флаг, на основании которого я решаю, должно ли сообщение быть выровнено влево или вправо.Ограничения работают правильно, если я использую только одно направление выравнивания, оно даже корректно работает с выравниванием на основе условий, если количество сообщений в UICollectionView
не меньше четырех.Итак, я знаю, что ограничения не являются неправильными.Но как только я добавляю четвертое сообщение, выравнивание и последовательность содержимого предыдущих ячеек и ячеек нарушается.Прикрепленный снимок экрана показывает проблему.
правильное поведение с 3 или менее сообщениями
неправильное поведение при добавлении 4 или более сообщений
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: У меня естьдобавлен отдельный вопрос для проблемы, описанной в ОБНОВЛЕНИЕ 2 здесь