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

Sat*_*h J 2 ios swift

我可以通过使用,打印出主视图约束常数,

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约束常量请注意:视图控制器可能有多个视图和子视图,子视图可能有自己的子视图.所以我们需要创建一个算法,如果使用的话,它可以有效地在任何类型的视图控制器中打印出约束常量.

vac*_*ama 5

这是使用递归的理想场所。编写一个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)


Mar*_*n R 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) }
    }
}
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)

  • 是.他的描述是一本教科书递归案例.很好的通用实现! (4认同)