UIDebuggingInformationOverlay是一个私有的UIWindow子类,用来帮助开发者调试Apple自己的app。本文主要做翻译,介绍了如何调用以及各项的用途,希望可以对大家有搜帮助。下文所有的我指的是原作者。原文地址。
最近我浏览UIKit框架的一些私有header的时候,发现了一个以前没有注意到的类 —— UIDebuggingInformationOverlay
。Goo404le搜索并没有提供给我一些有用的信息,所以我尝试来简单的描述一下我发现的内容。
UIDebuggingInformationOverlay
是UIWindow的一个子类,但是是私有的。Apple写这个类的目的很可能是为了帮助开发者和设计者来调试Apple自己的iOS app。
当这个类在你的项目调用的时候,这个窗口浮动在你自己app的内容之上,如下图
这篇文章我会向你展示如何去调用它,并对我自己理解的内容做一个简单的总结。
如何展示UIDebuggingInformationOverlay
要展示UIDebuggingInformationOverlay需要如下两个步骤:
- 调用
[UIDebuggingInformationOverlay prepareDebuggingOverlay]
- 事实上我也不是很确定这个方法究竟做了什么,但是如果不调用的话覆盖的内容会是一片空白。 - 调用
[[UIDebuggingInformationOverlay overlay] toggleVisibility]
- 这个方法会将覆盖的window展示出来(假设它并不是已经很明显)
因为这个类以及方法都是私有的,所以你无法直接去调用它,你可能需要多做一点操作才能让代码运行起来。一种方法是使用全局函数NSClassFromString
和NSSelectorFromString
。
Swift版本
let overlayClass = NSClassFromString("UIDebuggingInformationOverlay") as? UIWindow.Type
_ = overlayClass?.perform(NSSelectorFromString("prepareDebuggingOverlay"))
let overlay = overlayClass?.perform(NSSelectorFromString("overlay")).takeUnretainedValue() as? UIWindow
_ = overlay?.perform(NSSelectorFromString("toggleVisibility"))
Object-C版本
UIWindow *debugWindow = (UIWindow *)NSClassFromString(@"UIDebuggingInformationOverlay");
[debugWindow performSelector:NSSelectorFromString(@"prepareDebuggingOverlay") withObject:nil];
[[debugWindow performSelector:NSSelectorFromString(@"overlay") withObject:nil] performSelector:NSSelectorFromString(@"toggleVisibility") withObject:nil];
译者注:代码添加在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
即可。
需要注意的是,构建你的app向Apple Store提交的时候记得移除。否则你的app很大可能是会被拒的。
2017.5.26 更新 感谢Bryce Pauken,这个哥们发现了你只需要调用一次
[UIDebuggingInformationOverlay prepareDebuggingOverlay]
即可,用两个手指点击状态栏就可以呼出这个控制台。toggleVisibility
不再需要调用了。
** UIDebuggingInformationOverlay能做什么**
如同你在上面截图中所见的,这个窗口提供了七个可用的特性。我会简单介绍一下前六个,但是最后一个特性System Color Audit
并没有想我展示任何东西所以我无法说明。如果你发现了什么欢迎发消息告诉我。
View Hierarchy
这个选项可以向你展示当前选择的Window的视图列表。通过这个你可以轻松的查阅视图的详细信息,包括视图的frame
和成员变量。如果你的app包含了多个Window你可以自行去选择要查看的Window,或者对系统的Window有所好奇的话,你也可以通过这个来进行查看。
VC Hierarchy
这个特性让你可以很轻松的查看活跃的VC的层次。通过这个你可以很轻松的查看各个VC的详情,包括它的试图。你也可以查看这个视图究竟是展示的情景还是它自己本身。
Ivar Explorer
这个特性提供了查看UIApplication
对象的成员变量的途径。更重要的一点是,其中任一一个对象的变量都是可以被查看的。如果你的app结构允许的话,这其中包含的app delegate
也许提供一个很好的切入点,允许你进入自定义的对象里。
Measure
这是一个比较酷的特性,它允许你以点这个级别的精度去测量屏幕内各个元素的尺寸。首先,选择你想查看水平Horizontal还是竖直* Vertical*的轴线,然后在屏幕上拖动你的手指,使用控制台里的放大镜来配合你精确的选择。这里有两种模式:
默认的模式是忽略视图的边界。我认为这个模式是将屏幕当做一个栅格化的图片,然后使用颜色的变化来当做边界从而测量尺寸。比如说在下面的这个截图里,我可以测量label中文字的边界和屏幕边界的距离。
View Mode则是另外一种处理方式。它清晰的展示了每一个子视图的尺寸。拖动你的手指到要查看的视图上,可以查看它在你选择的轴线上的范围。在下面的屏幕截图里,我测量了顶部输入框的高度。
Spec Compare
我认为这个工具对于设计师和开发者之间的合作,提供了极其大的便利。添加一个屏幕截图到你的设备里然后通过Spec Compare选择它,被选择的这张屏幕截图会展示在当前app的顶部。你可以在屏幕上拖动来调整透明度,以此来对比设计和你app中的实现具体的不同。
2017.5.26更新:Patrick Balestra提醒了我,漏了很重要的一步那就是你需要在你的info.plist中添加
[NSPhotoLibraryUsageDescription](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW17)
,点击Add按钮将会跳转到UIImagePickerController
。如果缺少这一步的操作你的app会发生crash。
Wrap-up
这个东西我研究了一段时间并且希望将它应用到我们的下一个beta版本。这个控制台确实比较的粗糙,但是它确实值得被多多研究,来实现一些开源的工具。如果你有机会使用它并且发现了一些我没有注意到的事情,希望你能告诉我,我会将它更新出来。