Странное поведение при добавлении ограничений на основе условия - PullRequest
0 голосов
/ 14 июня 2019

Я делаю видение для разговора между двумя людьми.Я использовал 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 здесь

1 Ответ

0 голосов
/ 14 июня 2019

Он даже корректно работает с выравниванием на основе условий, если количество сообщений в UICollectionView не меньше четырех.

Это происходит, когда ячейки коллекции удаляются из очереди, поэтому, когда появляется четвертая ячейка, у нее может быть выравнивание по левому / правому краям, и ваш код пытается дать ей обратное, отсюда конфликт

Что вы можете сделать, это создать 2 ограничения и установить их внутри init

var leftCon,rightCon:NSLayoutConstraint!

Затем поиграйте с ними в соответствии с выравниванием сообщений внутри cellForRowAt

leftCon.isActive = isLeftAligned
rightCon.isActive = !isLeftAligned
...