#swift #uicollectionviewcell #nslayoutconstraint
#swift #uicollectionviewcell #nslayoutconstraint
Вопрос:
У меня есть приложение для обмена сообщениями, и отображаемые сообщения находятся в представлении коллекции, у меня есть пользовательская ячейка, в которой у меня есть текстовое представление, отображающее сообщение, а затем я помещаю textview внутрь пользовательского представления, чтобы я мог придать сообщению цвет фона в зависимости от пользователя, отправившего сообщение
Моя функция в моей пользовательской ячейке устанавливает фоновый вид вправо или влево в зависимости от того, от текущего пользователя сообщение или нет
Я делаю это, загружая в свою модель сообщений информацию, если сообщение от текущего пользователя или другого пользователя по идентификатору UID, поскольку я использую Firestore
Что происходит, так это то, что в тот момент, когда у меня достаточно сообщений, в которых я могу прокручивать представление коллекции, ограничения случайным образом начинают меняться, а некоторые фоновые изображения ячеек расширяют всю ширину коллекции
Я попытался поместить свою функцию в DispatchQueue и все равно получаю те же проблемы
есть идеи??
class MessageCell: UICollectionViewCell {
var bubbleLeftAnchor : NSLayoutConstraint!
var bubbleRightAnchor: NSLayoutConstraint!
var messagess : Message? {
didSet {
configure()
}
}
let label : UITextView = {
let lbl = UITextView()
lbl.backgroundColor = .clear
lbl.font = .systemFont(ofSize: 16)
lbl.textColor = .black
lbl.isEditable = false
lbl.isScrollEnabled = false
return lbl
}()
var bubble : UIView = {
let view = UIView()
view.layer.cornerRadius = 5
return view
}()
override init(frame: CGRect) {
super.init(frame: .zero)
addSubview(bubble)
bubble.addSubview(label)
bubble.anchor(top: topAnchor, bottom: bottomAnchor, paddingTop: 10 , paddingLeft: 50, paddingBottom: 20)
bubble.widthAnchor.constraint(lessThanOrEqualToConstant: 250).isActive = true
label.anchor(top: bubble.topAnchor, left: bubble.leftAnchor, bottom: bubble.bottomAnchor, right: bubble.rightAnchor, paddingTop: 4, paddingLeft: 4, paddingBottom: 4, paddingRight: 4)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func configure() {
label.text = messagess?.message
bubble.backgroundColor = messagess?.isFromCurrentUser == true ? .green : .purple
guard let messagess = messagess else {return}
bubbleLeftAnchor = bubble.leftAnchor.constraint(equalTo: leftAnchor, constant: 12)
bubbleRightAnchor = bubble.rightAnchor.constraint(equalTo: rightAnchor, constant: -12)
if messagess.fromId == Auth.auth().currentUser?.uid {
bubbleLeftAnchor.isActive = false
bubbleRightAnchor.isActive = true
} else {
bubbleRightAnchor.isActive = false
bubbleLeftAnchor.isActive = true
}
}
}
Ответ №1:
Вы создаете НОВЫЕ ограничения при каждом вызове configure()
.
Вам нужно переместить эти две строки:
bubbleLeftAnchor = bubble.leftAnchor.constraint(equalTo: leftAnchor, constant: 12)
bubbleRightAnchor = bubble.rightAnchor.constraint(equalTo: rightAnchor, constant: -12)
от configure()
к вашей init()
функции:
override init(frame: CGRect) {
super.init(frame: .zero)
addSubview(bubble)
bubble.addSubview(label)
bubble.anchor(top: topAnchor, bottom: bottomAnchor, paddingTop: 10 , paddingLeft: 50, paddingBottom: 20)
bubble.widthAnchor.constraint(lessThanOrEqualToConstant: 250).isActive = true
label.anchor(top: bubble.topAnchor, left: bubble.leftAnchor, bottom: bubble.bottomAnchor, right: bubble.rightAnchor, paddingTop: 4, paddingLeft: 4, paddingBottom: 4, paddingRight: 4)
// create these constraints in init
bubbleLeftAnchor = bubble.leftAnchor.constraint(equalTo: leftAnchor, constant: 12)
bubbleRightAnchor = bubble.rightAnchor.constraint(equalTo: rightAnchor, constant: -12)
}
Комментарии:
1. @farooq — если этот ответ решил вашу проблему, обязательно отметьте его «Принято» в интересах других пользователей, которые могут столкнуться с вашим вопросом.
2. да, я пометил это, но, поскольку я новичок, моя репутация все еще ниже 15, поэтому не отображается, но все равно регистрируется
3. Упс — я должен был это заметить.