可以重新激活 NSLayoutConstraint 吗?
Posted
技术标签:
【中文标题】可以重新激活 NSLayoutConstraint 吗?【英文标题】:can an NSLayoutConstraint be re-activated? 【发布时间】:2016-06-27 17:08:06 【问题描述】:我有一个用户可以扩展和收缩的结果容器。我想删除一个约束并添加一个新约束。单击它可以正常工作,但再次单击(即设置 newConstraint.active=false 和 resultTopConstraint=true 会导致它崩溃)。我有以下内容:
@IBAction func toggleResultContainer(sender: AnyObject)
isResultsOpen = !isResultsOpen
//resultTopConstraint.constant = isResultsOpen ? -300.0 : 0.0
self.view.sendSubviewToBack(searchView)
let newConstraint = NSLayoutConstraint(
item: resultsContainer,
attribute: .Top,
relatedBy: .Equal,
toItem: resultsContainer.superview!,
attribute: .Top,
multiplier: 1.0,
constant: 30.0
)
if(isResultsOpen)
resultTopConstraint.active = false
newConstraint.active = true
else
resultTopConstraint.active = true
newConstraint.active = false
UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.4, initialSpringVelocity: 10.0, options: .CurveEaseIn, animations:
self.view.layoutIfNeeded()
, completion: nil)
并获取Unable to simultaneously satisfy constraints.
上面的代码应该工作吗?这真的是一个同时满足约束的问题吗?我试过设置约束
@IBOutlet var resultTopConstraint: NSLayoutConstraint!
对weak
和strong
(根据https://***.com/a/28717185/152825),但似乎没有效果。一个
【问题讨论】:
【参考方案1】:试试这个:
if (isResultsOpen)
NSLayoutConstraint.deactivateConstraints([resultTopConstraint])
NSLayoutConstraint.activateConstraints([newConstraint])
else
NSLayoutConstraint.deactivateConstraints([newConstraint])
NSLayoutConstraint.activateConstraints([resultTopConstraint])
【讨论】:
thx - 似乎没有这样做(但一个很好的建议)。我有强烈的感觉,这是一个有效的约束冲突。我对自动布局没有那么丰富的经验,所以可能做错了什么。 刚刚用另一个建议更新了我的答案,告诉我这是否有效 我认为这行得通!我不得不把它们放在像NSLayoutConstraint.deactivateConstraints([resultTopConstraint])
这样的数组中。谢谢以上是关于可以重新激活 NSLayoutConstraint 吗?的主要内容,如果未能解决你的问题,请参考以下文章
重新激活 NSLayoutConstraint 在展开可选时发现 nil