如何在Swift IOS中打印出所有约束常量?

时间:2017-12-03 15:32:21

标签: ios swift

我可以使用

打印主视图约束常量
for v in view.constraints {
    print(v.constant)
}

但它不会遍历子视图来打印它们的约束。 所以,我有......

for subview in view.subviews {
    for v in subview.constraints {
        print(v.constant)
    }
}

现在问题是如果子视图本身就是一个什么?。在这种情况下,如何打印出subview->视图约束常量。可能是子视图中的视图可能有自己的子视图等等......

要解决此问题, 我可以简单地为所有视图创建出口,然后我必须逐个迭代它们以获得其约束常数。

但我觉得必须有一种简单的方法可以在不创建出口的情况下以编程方式打印出所有约束常量(在特定视图控制器下的故事板中创建的所有约束)。

简而言之:

如何从视图控制器中打印出所有storybaord约束常量 请注意:视图控制器可能有多个视图和子视图,子视图可能有自己的子视图。所以我们需要创建一个算法,该算法可以有效地在任何类型的视图控制器中打印出约束常量(如果使用的话)。

3 个答案:

答案 0 :(得分:5)

使用通用递归遍历方法

extension UIView {
    func callRecursively(level: Int = 0, _ body: (_ subview: UIView, _ level: Int) -> Void) {
        body(self, level)
        subviews.forEach { $0.callRecursively(level: level + 1, body) }
    }
}

你可以用

获得你的输出
    view.callRecursively { subview, level in
        for constraint in subview.constraints {
            print(String(repeating: " ", count: level),  constraint.constant)
        }
    }

每个输出行根据嵌套级别缩进 在视图层次结构中。

另一个例子如何使用递归方法:查找全部 某种类型的子视图:

    view.callRecursively { subview, _ in
        if let label = subview as? UILabel {
            print(label.text ?? "<none>")
        }
    }

答案 1 :(得分:4)

这是使用递归的理想场所。编写一个printConstraintConstants(for:)函数,让它打印出当前视图的常量,让它为当前视图的所有子视图调用自己:

func printConstraintConstants(for view: UIView) {
    for constraint in view.constraints {
        print(constraint.constant)
    }

    for subview in view.subviews {
        printConstraintConstants(for: subview)
    }
}

答案 2 :(得分:3)

您可以使用队列进行广度优先搜索。当然,初始视图应该是层次结构中的最顶层,以便到达每个视图。

var allViews : [UIView] = []

allViews.append(self.view) // Add the top-most view first

while allViews.count > 0 {
    let currentView = allViews.removeFirst()

    allViews.append(contentsOf: currentView.subviews)

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