如何在 iOS 中检查视图层次结构?

是否有一个 GUI 工具可以检查 iOS 应用程序的视图层次结构?我在考虑 Webkit 的 Web 检查器或类似的工具。我正在调试布局问题,比如视图位置或大小错误,或者子元素没有正确包含在其父元素中。目前,我必须添加断言来手动测试这些不同的条件,或者在不同的视图上设置不同的背景颜色,正如你可以想象的那样,这是一个非常乏味的方法。

我查看了 Instruments 的 UI recorder,但它只能记录和回放 UI 操作,而且在任何情况下都只适用于 Mac 应用程序。

还有更好的解决办法吗?

88372 次浏览

我不知道是否有 GUI 视图检查工具,但是我在 UIView: -recursiveDescription的调试方法上有一些运气

如果在调试器中暂停程序并将其输入到 GDB 中(Edit: 也可以在 LLDB 中使用)

Po [[ UIWindow keyWindow ] RecursiveDescription ]

您将获得整个视图层次结构的打印输出。您还可以对特定的视图调用它,以获得该视图的视图层次结构的打印输出。

从中得到的信息可能有点枯燥乏味,但事实证明它对我很有用。

值得一提的是 这篇博文,它谈到了这种方法,也链接到 这很有帮助,但很难找到苹果的技术说明

这个问题是旧的,但让我把信息在这里的新工具,我开发: Https://github.com/glock45/ios-hierarchy-viewer enter image description here

enter image description here

为了让这个帖子更新,我最近一直在玩 火花探长。虽然不是免费的,但是很不错。

Reveal app screenshot

奇怪的是,现在还有另外一个选项,http://revealapp.com/,这是一个公开(免费)的测试版。如你所见,这是另一个视觉检查员。

编辑2014-04-05: 显示是出了 Beta,不再免费。有一个30天的试验,但是。

免费: 只要输入这个检查员:

po [[UIWindow keyWindow] recursiveDescription]

商业: http://revealapp.com/我测试了揭示程序的测试版,它很好,虽然有缺陷。 另一个商业工具: http://sparkinspector.com/,它的工作无缝。

Xcode 6现在已经内置了3D 视图层次结构检查,如显示应用程序和火花检查器。

enter image description here

当你的应用程序运行时,点击“调试视图层次结构”按钮来暂停执行并在当前时刻检查视图。

enter image description here

更多信息请访问 苹果的文档

FLEX 调试器提供了一个应用程序内视图检查器,允许您修改正在运行的应用程序中的 UI。它还记录网络请求。

Https://github.com/flipboard/flex

enter image description here

使用 Xcode 8和 Swift 2.3,这个被认可的答案对我来说不再有效:

po UIApplication.sharedApplication().keyWindow?.recursiveDescription()

这将在调试窗口中转储所有内容。(难以读取) : ( 使用 iOS10,Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()

Swift 4.

IOS :

extension UIView {


// Prints results of internal Apple API method `recursiveDescription` to console.
public func dump() {
Swift.print(perform(Selector(("recursiveDescription"))))
}
}

MacOS :

extension NSView {


// Prints results of internal Apple API method `_subtreeDescription` to console.
public func dump() {
Swift.print(perform(Selector(("_subtreeDescription"))))
}
}

用法(在调试器中) : po myView.dump()

对于 Swift/Xcode 10,在调试控制台中输入以下内容:

po yourView.value(forKey: "recursiveDescription")!

它将打印出任何给定 UIView的递归层次结构。

(图片来源: 如何调试您的视图层次结构使用递归描述)