我可以通过使用,打印出主视图约束常数,
for v in view.constraints {
print(v.constant)
}
Run Code Online (Sandbox Code Playgroud)
但它也不会遍历子视图来打印它们的约束.所以,我...
for subview in view.subviews {
for v in subview.constraints {
print(v.constant)
}
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果子视图本身就是一个视图?.在这种情况下,如何打印出子视图 - >视图约束常量.可能是子视图中的视图可能有自己的子视图等等......
要解决这个问题,我可以简单地为所有视图创建出口,然后我必须逐个迭代它们以获得它的约束常量.
但我觉得必须有一个简单的方法来打印出所有约束常量(在特定视图控制器下的故事板中创建的所有约束),以编程方式完成而不创建出口.
简而言之 :
如何打印视图控制器中的所有storybaord约束常量请注意:视图控制器可能有多个视图和子视图,子视图可能有自己的子视图.所以我们需要创建一个算法,如果使用的话,它可以有效地在任何类型的视图控制器中打印出约束常量.
这是使用递归的理想场所。编写一个printConstraintConstants(for:)函数,并使其输出当前视图的常量,并对其进行调用以用于当前视图的所有子视图:
func printConstraintConstants(for view: UIView) {
for constraint in view.constraints {
print(constraint.constant)
}
for subview in view.subviews {
printConstraintConstants(for: subview)
}
}
Run Code Online (Sandbox Code Playgroud)
使用通用递归遍历方法
extension UIView {
func callRecursively(level: Int = 0, _ body: (_ subview: UIView, _ level: Int) -> Void) {
body(self, level)
subviews.forEach { $0.callRecursively(level: level + 1, body) }
}
}
Run Code Online (Sandbox Code Playgroud)
你可以得到你的输出
view.callRecursively { subview, level in
for constraint in subview.constraints {
print(String(repeating: " ", count: level), constraint.constant)
}
}
Run Code Online (Sandbox Code Playgroud)
每个输出行根据视图层次结构中的嵌套级别缩进.
另一个示例如何使用递归方法:查找特定类型的所有子视图:
view.callRecursively { subview, _ in
if let label = subview as? UILabel {
print(label.text ?? "<none>")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2291 次 |
| 最近记录: |