Ios UITableViewCell子类上的自动布局在重用后中断

Ios UITableViewCell子类上的自动布局在重用后中断,ios,swift,uitableview,autolayout,nslayoutconstraint,Ios,Swift,Uitableview,Autolayout,Nslayoutconstraint,我有一个子类UITableViewCell,它使用自动布局,并通过UITableViewregisterNib(nib:UINib,forCellReuseIdentifier:String)和dequeueReusableCellWithIdentifier(identifier:String)重用。该单元格有两个按钮,我在layoutSubviews()上设置了自动布局约束: 这只适用于第一次实例化单元格。重复使用后,水平间距和大小调整中断。在反复尝试并设置断点之后,我发现updateCon

我有一个子类UITableViewCell,它使用自动布局,并通过UITableView
registerNib(nib:UINib,forCellReuseIdentifier:String)
dequeueReusableCellWithIdentifier(identifier:String)
重用。该单元格有两个按钮,我在
layoutSubviews()
上设置了自动布局约束:

这只适用于第一次实例化单元格。重复使用后,水平间距和大小调整中断。在反复尝试并设置断点之后,我发现
updateConstraints
layoutSubviews
之后调用,并且仅在第一次实例化单元格时调用,而不是在重用之后调用

在我做了一点手脚之后,我试着这样做:

override func updateConstraints()
{
    super.updateConstraints()
    self.hasUpdated = true
}

override func layoutSubviews()
{
    super.layoutSubviews()

    if (!self.hasUpdated)
    {
        //Clear all constraints from the cell
        self.contentView.removeConstraints(self.contentView.constraints())
        self.oneButton.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.twoButton.setTranslatesAutoresizingMaskIntoConstraints(false)

        let viewsDict : [NSObject: AnyObject] = ["oneButton" : self.oneButton, "twoButton": self.twoButton]

        //Setting the constraints
        self.contentView.addConstraint(NSLayoutConstraint(item: self.oneButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: self.twoButton, attribute: NSLayoutAttribute.Width, multiplier: 1.0, constant: 0.0))
        self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-25-[oneButton]-25-[twoButton]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
        self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-25-[oneButton(40)]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
        self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-25-[twoButton(40)]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
    }
}
现在它可以像预期的那样工作了,但我觉得我可能在抑制一些重用布局机制,因为我并不总是设置约束。有什么想法吗

编辑:在下面的评论之后,我认为
删除约束
设置TranslatesAutoResistingGMaskintoConstraints
调用可能是罪魁祸首。我当时所做的是停止覆盖
layoutSubviews
,并将其更改为:

override func awakeFromNib()
{
    super.awakeFromNib()

    self.contentView.removeConstraints(self.contentView.constraints())
    self.oneButton.setTranslatesAutoresizingMaskIntoConstraints(false)
    self.twoButton.setTranslatesAutoresizingMaskIntoConstraints(false)
    // Initialization code
}

override func updateConstraints()
{
    super.updateConstraints()

    let viewsDict : [NSObject: AnyObject] = ["oneButton" : self.oneButton, "twoButton": self.twoButton]

    //Setting the constraints
    self.contentView.addConstraint(NSLayoutConstraint(item: self.oneButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: self.twoButton, attribute: NSLayoutAttribute.Width, multiplier: 1.0, constant: 0.0))
    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-25-[oneButton]-25-[twoButton]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-25-[oneButton(40)]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-25-[twoButton(40)]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
}

现在我不想去破解重用机制。。。不过,对此有什么想法吗?

根据苹果公司的说法,应该在“updateConstraint”上设置自定义约束。。此外,layoutSubviews不能保证只调用一次,这就是为什么您的boolean hack在trickI之前尝试过它,但又尝试了一次。。。在updateConstraints上设置约束会破坏第一次初始化时的预期行为约束在我看来是“完整的”。。。也许没有足够的信息?
override func awakeFromNib()
{
    super.awakeFromNib()

    self.contentView.removeConstraints(self.contentView.constraints())
    self.oneButton.setTranslatesAutoresizingMaskIntoConstraints(false)
    self.twoButton.setTranslatesAutoresizingMaskIntoConstraints(false)
    // Initialization code
}

override func updateConstraints()
{
    super.updateConstraints()

    let viewsDict : [NSObject: AnyObject] = ["oneButton" : self.oneButton, "twoButton": self.twoButton]

    //Setting the constraints
    self.contentView.addConstraint(NSLayoutConstraint(item: self.oneButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: self.twoButton, attribute: NSLayoutAttribute.Width, multiplier: 1.0, constant: 0.0))
    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-25-[oneButton]-25-[twoButton]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-25-[oneButton(40)]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
    self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-25-[twoButton(40)]-25-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
}