当我在收藏视图中滚动时,我的自定义单元格中的 UIView 锚点不断变化

Posted

技术标签:

【中文标题】当我在收藏视图中滚动时,我的自定义单元格中的 UIView 锚点不断变化【英文标题】:My UIView anchors in my custom cell keep changing when I scroll in my collection view 【发布时间】:2020-10-20 16:04:17 【问题描述】:

我有一个消息传递应用程序,并且显示的消息在集合视图中,我有一个自定义单元格,其中我有一个显示消息的文本视图,然后我将 textview 放在 UIView 中,以便我可以给出消息背景颜色取决于发送消息的用户

我的自定义单元格中的函数将背景视图设置为右侧或左侧,具体取决于 消息是否来自当前用户

我通过在我的消息模型中上传信息来做到这一点,如果消息来自当前用户或 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)
    

【讨论】:

@farooq - 如果此答案解决了您的问题,请务必将其标记为“已接受”,以便其他可能遇到您问题的用户受益。 是的,我确实标记了它,但由于我是新人,所以我的声誉仍然在 15 岁以下,所以没有出现,但仍然被注册 哎呀——我应该注意到了。

以上是关于当我在收藏视图中滚动时,我的自定义单元格中的 UIView 锚点不断变化的主要内容,如果未能解决你的问题,请参考以下文章

滚动时自定义 UITableViewCell 中的 UITextFields 文本出现在其他单元格中

当我开始水平滚动时,为啥我的收藏视图中的单元格被取消选择?

表格视图单元格中的倒数计时器在滚动后显示不同的值

滚动 UITableView 时自定义单元格中的 UITextField 文本正在更改

UITableView 中的自定义单元格使图像在滚动时重叠

从自定义单元格 iPhone 中的 textField 获取值