如何移除centerXAnchor约束?iOS按钮布局调整失效求助
问题原因及解决方案
问题根源
你调用buttonView!.removeConstraints(buttonView!.constraints)只能移除按钮自身持有的约束,但之前让按钮居中的centerXAnchor约束是被父视图mainView持有的,这行代码根本没删掉那个居中约束。新旧约束冲突时,AutoLayout会通过拉伸按钮宽度来同时满足“居中”和“左对齐”的要求,所以按钮变成了全宽样式。
解决方法
方法1:保存原约束引用(推荐)
一开始设置居中约束时,把约束保存为属性,后续直接移除这个特定约束:
// 声明属性保存原约束 var centerXConstraint: NSLayoutConstraint? // 初始设置居中时 centerXConstraint = buttonView!.centerXAnchor.constraint(equalTo: mainView.centerXAnchor) NSLayoutConstraint.activate([ centerXConstraint!, buttonView!.bottomAnchor.constraint(equalTo: mainView.bottomAnchor, constant: 20) ]) // 改为左对齐时 if let constraint = centerXConstraint { constraint.isActive = false } NSLayoutConstraint.activate([ buttonView!.leadingAnchor.constraint(equalTo: mainView.leadingAnchor, constant: 12), buttonView!.bottomAnchor.constraint(equalTo: mainView.bottomAnchor, constant: 20) ])
方法2:移除父视图中与按钮相关的所有约束
如果没保存原约束,可以遍历父视图的约束,移除所有关联到buttonView的约束:
// 移除mainView中所有和buttonView相关的约束 mainView.constraints.forEach { constraint in if constraint.firstItem as? UIView == buttonView || constraint.secondItem as? UIView == buttonView { constraint.isActive = false } } // 添加新的左对齐约束 NSLayoutConstraint.activate([ buttonView!.leadingAnchor.constraint(equalTo: mainView.leadingAnchor, constant: 12), buttonView!.bottomAnchor.constraint(equalTo: mainView.bottomAnchor, constant: 20) ])
注意点
- 不要用
removeConstraints直接操作视图的constraints属性,因为大部分布局约束是被父视图持有而非子视图自身。 - 修改约束时,优先通过
isActive = false来停用旧约束,再激活新约束,比直接调用removeConstraints更安全。
内容的提问来源于stack exchange,提问作者Lalit Rawat
相关产品推荐
相关产品推荐

