如何在 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 in
与forEach
的问题。
@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 中打印出所有约束常量?的主要内容,如果未能解决你的问题,请参考以下文章
Swift iOS - 如何打印导航堆栈中尚未推送的所有子视图控制器的列表