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

Posted

技术标签:

【中文标题】如何在 Swift IOS 中打印出所有约束常量?【英文标题】:How to print out all constraints constant in Swift IOS? 【发布时间】:2017-12-03 15:32:21 【问题描述】:

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

for v in view.constraints 
    print(v.constant)

但它也不会遍历 subviews 来打印它们的约束。 所以为此,我有...

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

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

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

但我觉得必须有简单的方法以编程方式完整地打印出所有约束常量(在特定视图控制器下的情节提要中创建的所有约束),而无需创建出口。

简而言之:

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

【问题讨论】:

注意它通常更容易使用视图调试器 【参考方案1】:

使用通用递归遍历方法

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>")
        
    

【讨论】:

是的。他的描述是一个教科书递归案例。不错的通用实现! @Martin R 。感谢您的回答我还没有测试过,但我有一个疑问。在其他答案中,他们使用了“constraint.constant”(这间接意味着我也可以做constraint.constant = constant + 10(常量的某种类型的变化))我怎么能对你的答案做同样的事情? @SatizhJ:查看更新。这只是for inforEach 的问题。 @SatizhJ:其实你也可以在之前的版本中使用$0.constant += 10【参考方案2】:

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

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

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

【讨论】:

看来我们有同样的想法...... :)【参考方案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)
    

【讨论】:

似乎与其他答案一起工作,但让我在接受任何答案之前对其进行测试。谢谢大家:)

以上是关于如何在 Swift IOS 中打印出所有约束常量?的主要内容,如果未能解决你的问题,请参考以下文章

从 Storyboard iOS 导出或打印自动布局约束

Swift iOS - 如何打印导航堆栈中尚未推送的所有子视图控制器的列表

在 Swift 中以编程方式更新约束的常量属性?

iOS - 通过 Swift 更改约束乘数 [重复]

如何在ios swift中以编程方式创建自动布局等宽度约束?

如何在 ios swift 中以编程方式创建自动布局等宽约束?