使用 NSLayoutAnchor 时清除约束

Posted

技术标签:

【中文标题】使用 NSLayoutAnchor 时清除约束【英文标题】:clear constraints when using NSLayoutAnchor 【发布时间】:2017-04-12 14:13:55 【问题描述】:

我是在没有界面生成器的情况下创建视图的新手。 我正在使用NSLayoutAnchors 创建视图!

当我使用像这样在视图控制器中创建的视图时:

let borderView:UIView = 

    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = UIColor.lightGray
    view.isUserInteractionEnabled = false
    view.alpha = 0.5
    return view

()

然后我用这个视图在这样的视图中添加边界:

view.addSubview(borderView)
borderView.bottomAnchor.constraint(equalTo: headerView.bottomAnchor).isActive = true
borderView.leftAnchor.constraint(equalTo: headerView.leftAnchor).isActive = true
borderView.rightAnchor.constraint(equalTo: headerView.rightAnchor).isActive = true
borderView.heightAnchor.constraint(equalToConstant: 1).isActive = true

然后在另一个视图中我试试这个:

    informationView.addSubview(borderView)

    borderView.topAnchor.constraint(equalTo: informationView.topAnchor).isActive = true
    borderView.leftAnchor.constraint(equalTo: informationView.leftAnchor).isActive = true
    borderView.rightAnchor.constraint(equalTo: informationView.rightAnchor).isActive = true
    borderView.heightAnchor.constraint(equalToConstant: 1).isActive = true

但看起来这个视图有它以前的约束结束显示约束错误!

如何在重用之前删除borderView 约束?

【问题讨论】:

Remove all constraints affecting a UIView的可能重复 这并不是真正的重复,因为答案是不重用视图(在这种情况下移除约束无济于事) 【参考方案1】:

您不能重复使用视图。每个视图只能在视图层次结构中出现一次。您需要为要使用的每个视图创建一个新的带边框的视图对象。

要回答这个问题,您可以使用 view.removeConstraints(view.constraints) 从视图中删除约束

【讨论】:

使用此方法制作边框视图的最佳做法是什么? 类似的东西:(1)没有它的属性(2)创建一个接受视图的函数,创建一个新的边框视图,设置约束并将其作为子添加到传递在视图中,所以你只需要addBorderView(to: view)

以上是关于使用 NSLayoutAnchor 时清除约束的主要内容,如果未能解决你的问题,请参考以下文章

将可视格式的约束转换为 NSLayoutAnchor API

使用 NSLayoutAnchor 不好吗?

使用 NSLayoutAnchor.constraintEqualToSystemSpacingAfter 时的控制台警告

NSLayoutAnchor 的类型

扩展 NSLayoutAnchor 中的编译错误

Nil 与预期的参数类型 'NSLayoutAnchor<NSLayoutDimension>' Swift 3 不兼容