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