【问题标题】:Visualization of view hierarchy on iOSiOS 上视图层次结构的可视化
【发布时间】:2012-07-27 12:11:37
【问题描述】:

在开发 iOS 应用程序时,我发现在调试器中使用 po [[UIWindow keyWindow] recursiveDescription] 非常有用。但是,我想知道是否有一种工具可以优雅地表示输出以提高可读性?

【问题讨论】:

标签: iphone ios xcode ipad


【解决方案1】:

这是我当年写的一个方法:

- (void)logView:(UIView*)v index:(int)i
{
    NSMutableString *str = [NSMutableString string];
    for (int u = 0; u<i; u++) { [str appendString:@"| "]; }
    [str appendFormat:@"<%@ %p frame:%@>", v.class, v, NSStringFromCGRect(v.frame)];
    // of course you can change it to display your accessibility hint/label
    printf("%s\n", [str UTF8String]);

    for (UIView *vv in v.subviews) { [self logView:vv index:i+1]; }
}

这样称呼它:[self logView:myView index:0];

样本输出:

<UITextField 0x6b30010 frame:{{20, 13}, {280, 31}}>
| <UITextFieldRoundedRectBackgroundView 0x6b31e00 frame:{{0, 0}, {280, 31}}>
| | <UIImageView 0x6b31fe0 frame:{{0, 0}, {0, 0}}>
| | <UIImageView 0x6b32070 frame:{{0, 0}, {0, 0}}>
| | <UIImageView 0x6b320e0 frame:{{0, 0}, {0, 0}}>

【讨论】:

  • 感谢分享。它实际上看起来很像 recursiveDescription 输出,对吧?
  • 它比这更短。例如。许多对象有更多的描述值,如标题和字体、类型等。但您可以通过appendFormat: 方法&lt;%@ %p frame:%@&gt; 调整格式
【解决方案2】:

我通常使用 po,但我不久前发现了这个工具,并打算尝试一下但没有。

它将自己嵌入到您的应用程序中,并将自己暴露为一个小型网络应用程序,因此您可以在使用应用程序时查看视图层次结构的状态。

http://blog.thepete.net/blog/2011/05/01/inspect-state-of-our-running-ios-apps/

编辑:

添加 cmets 中提到的 sparkinpector。我检查了它,它看起来很酷 - 特别是如果您以编程方式创建视图。

【讨论】:

【解决方案3】:

肯定有。在过去的几年里,我们取得了长足的进步,-recursiveDescription 是查看视图层次结构的一种非常痛苦的方式——尤其是当您的界面很复杂时。看看这个答案以获得一些更新的解决方案:

I need to inspect the view hierarchy on an iPhone program

【讨论】:

    【解决方案4】:

    使用显示应用程序:http://revealapp.com

    这可能会有所帮助。

    【讨论】:

      【解决方案5】:

      这是一种私人方式,

      编写如下代码,

      NSLog("%@",[[[UIApplication sharedApplication] keyWindow] performSelector(@selector(recursiveDescription))]);
      

      对于任何视图都类似:

      NSLog("%@",[view performSelector(@selector(recursiveDescription))]);
      

      这将为您提供整个视图层次结构。

      请注意,在您的应用程序中使用此方法后,请勿将您的代码提交给苹果,因为这是私有 api。只是,仅将这些用于调试目的。

      【讨论】: