有什么办法可以在Swift中以编程方式获取所有已应用的自动布局约束

时间:2018-09-11 07:11:49

标签: ios swift autolayout ios-autolayout

我想使用情节提要获得所有已应用约束的参考,而没有任何参考:

我尝试了很多方法,但是找不到确切的解决方案:

我的方法如下:

    if let constraint = (self.constraints.filter{$0.firstAttribute == .height}.first) {

}

使用上述方法,我只能找出高度。

if let topConstraint = (self.constraints.filter{$0.firstAttribute == .top}.first) {
            topConstraint.constant = 150//topMargin
        }
if let leadingConstraint = (self.constraints.filter{$0.firstAttribute == .leading}.first) {
            leadingConstraint.constant = 60 //leadingMargin
        }

对于topConstraint和LeadingConstraint,我的得分为零。

self.constraints

self.constraints仅给出一个高度参考,即使我在同一视图上应用了前,尾和底约束。

注意:我不想从情节提要中获取参考,因此请不要提出该解决方案的建议。我要动态引用。

我正在寻找类似以下的方法:

 if let topConstraint = (self.constraints.filter{$0.firstAttribute == .top}.first) {
                topConstraint.constant = 150//topMargin
            }
   if let leadingConstraint = (self.constraints.filter{$0.firstAttribute == .leading}.first) {
                leadingConstraint.constant = 60 //leadingMargin
            }
   if let trailingConstraint = (self.constraints.filter{$0.firstAttribute == .trailing}.first) {
                trailingConstraint.constant = 70//leadingMargin
            }
   if let bottomConstraint = (self.constraints.filter{$0.firstAttribute == .bottom}.first) {
                bottomConstraint.constant = 150//49 + bottomMargin
            }

但是不幸的是,以上一项对我不起作用:(

2 个答案:

答案 0 :(得分:0)

对于单个视图,您可以轻松获得与之相关的所有约束

for constraint in view.constraints {
   print(constraint.constant)
}

对于特定视图的所有子视图,您都可以像这样

func getAllTheConstraintConstantsFor(view:UIView) {

   for constraint in view.constraints {
      print(constraint.constant)
   }

   for subview in view.subviews {
      self.getAllTheConstraintConstantsFor(view: subview)
   }
}

在这里您可以通过self.view,您将获得所有约束。

答案 1 :(得分:0)

参考this答案

对于像UIButton这样的视图,您可以使用此代码找到top约束。

extension UIButton {

    func findTopConstraint() -> NSLayoutConstraint? {
        for constraint in (self.superview?.constraints)! {
            if isTopConstraint(constraint: constraint) {
                return constraint
            }
        }
        return nil
    }

    func isTopConstraint(constraint: NSLayoutConstraint) -> Bool {
        return (firstItemMatchesTopConstraint(constraint: constraint) || secondItemMatchesTopConstraint(constraint: constraint))
    }

    func firstItemMatchesTopConstraint(constraint: NSLayoutConstraint) -> Bool {
        return (constraint.firstItem as? UIButton == self && constraint.firstAttribute == .top )
    }

    func secondItemMatchesTopConstraint(constraint: NSLayoutConstraint) -> Bool {
        return (constraint.secondItem as? UIButton  == self && constraint.secondAttribute == .top)
    }
}

要在top上获得UIButton约束,只需使用以下代码

button.findTopConstraint()!

类似地,您可以在任何视图上找到任何约束。

注意:您需要自己管理nil的情况。