Мои привязки UIView в моей пользовательской ячейке продолжают меняться при прокрутке в представлении моей коллекции

#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. Упс — я должен был это заметить.