如何从我的超级视图中的所有子视图中删除约束?
How to remove constraints from all subviews inside my superview?
我有一个 UIView,其中包含多个具有自己约束的 UIView 子视图。如何删除子视图的约束?
//only removes the constraints on self.view
[self.view removeConstraints:self.view.constraints];
//I get warning: Incompatible pointer types sending 'NSArray *' to parameter of type 'NSLayoutConstraint'
[self.subview1 removeConstraints:self.subview1.constraints];
试试这个代码:
for (NSLayoutConstraint *constraint in self.view.constraints) {
if (constraint.firstItem == self.subview1 || constraint.secondItem == self.subview1) {
[self.view removeConstraint:constraint];
}
}
基本上,这会迭代分配给 self.view
的所有约束,并检查约束中是否涉及 self.subview1
。如果是这样,该约束将被取消。
您必须删除视图及其子视图的所有约束。所以创建一个UIView的扩展,然后定义如下方法:
extension UIView {
func removeAllConstraints() {
self.removeConstraints(self.constraints)
for view in self.subviews {
view.removeAllConstraints()
}
}
}
然后调用以下内容:
self.view.removeAllConstraints()
作为稍后的回答,这是在swift。这可能对你有帮助。
我在 UIView 上写了一个扩展:
extension UIView{
func removeConstraintsFromAllEdges(of view: UIView){
for constraint in constraints{
if (constraint.firstItem.view == view || constraint.secondItem?.view == view){
removeConstraint(constraint)
}
}
}
func addConstraintsToAllEdges(of view: UIView){
let leading = leadingAnchor.constraint(equalTo: view.leadingAnchor)
let top = topAnchor.constraint(equalTo: view.topAnchor)
let trailing = trailingAnchor.constraint(equalTo: view.trailingAnchor)
let bottom = bottomAnchor.constraint(equalTo: view.bottomAnchor)
NSLayoutConstraint.activate([leading, top, trailing, bottom])
}
}
有趣的是 secondItem
是 NSLayoutConstraint
的可选 属性 而 firstItem
是非可选的。为什么?因为有时您可能需要将视图的高度限制为一个常量值,所以您没有涉及 其他 个视图。
我接受了@Honey 的回答并对其进行了修改,以便视图可以删除与其父视图相关的约束。
extension UIView{
func removeConstraintsFromAllEdges(){
if let superview = superview {
for constraint in superview.constraints{
if let firstItem = constraint.firstItem, firstItem === self {
superview.removeConstraint(constraint)
}
if let secondItem = constraint.secondItem, secondItem === self {
superview.removeConstraint(constraint)
}
}
}
}
}
我有一个 UIView,其中包含多个具有自己约束的 UIView 子视图。如何删除子视图的约束?
//only removes the constraints on self.view
[self.view removeConstraints:self.view.constraints];
//I get warning: Incompatible pointer types sending 'NSArray *' to parameter of type 'NSLayoutConstraint'
[self.subview1 removeConstraints:self.subview1.constraints];
试试这个代码:
for (NSLayoutConstraint *constraint in self.view.constraints) {
if (constraint.firstItem == self.subview1 || constraint.secondItem == self.subview1) {
[self.view removeConstraint:constraint];
}
}
基本上,这会迭代分配给 self.view
的所有约束,并检查约束中是否涉及 self.subview1
。如果是这样,该约束将被取消。
您必须删除视图及其子视图的所有约束。所以创建一个UIView的扩展,然后定义如下方法:
extension UIView {
func removeAllConstraints() {
self.removeConstraints(self.constraints)
for view in self.subviews {
view.removeAllConstraints()
}
}
}
然后调用以下内容:
self.view.removeAllConstraints()
作为稍后的回答,这是在swift。这可能对你有帮助。
我在 UIView 上写了一个扩展:
extension UIView{
func removeConstraintsFromAllEdges(of view: UIView){
for constraint in constraints{
if (constraint.firstItem.view == view || constraint.secondItem?.view == view){
removeConstraint(constraint)
}
}
}
func addConstraintsToAllEdges(of view: UIView){
let leading = leadingAnchor.constraint(equalTo: view.leadingAnchor)
let top = topAnchor.constraint(equalTo: view.topAnchor)
let trailing = trailingAnchor.constraint(equalTo: view.trailingAnchor)
let bottom = bottomAnchor.constraint(equalTo: view.bottomAnchor)
NSLayoutConstraint.activate([leading, top, trailing, bottom])
}
}
有趣的是 secondItem
是 NSLayoutConstraint
的可选 属性 而 firstItem
是非可选的。为什么?因为有时您可能需要将视图的高度限制为一个常量值,所以您没有涉及 其他 个视图。
我接受了@Honey 的回答并对其进行了修改,以便视图可以删除与其父视图相关的约束。
extension UIView{
func removeConstraintsFromAllEdges(){
if let superview = superview {
for constraint in superview.constraints{
if let firstItem = constraint.firstItem, firstItem === self {
superview.removeConstraint(constraint)
}
if let secondItem = constraint.secondItem, secondItem === self {
superview.removeConstraint(constraint)
}
}
}
}
}