用于UI调试的开发人员工具

现代应用程序的用户界面是一个复杂的结构。 UI元素,布局和图形之间的复杂关系使调试过程变得很艰巨。 知道可用的工具可以减少调试时间,并使发现问题的过程变得微不足道。

在本文中,我想快速回顾一下Apple提供的UI调试工具。

View Hierarchy Debugger提供了检查和理解UI层次结构的功能。

应用程序的层次结构,视图,约束和视图控制器,显示为层次结构列表。 对象检查器和大小检查器。 甚至是交互式3D模型。 全部内置在Xcode中。 多么酷啊!

调试视图层次结构按钮位于调试栏中。 Xcode将您的应用暂停在当前状态。

View调试可用于iOS,tvOS和macOS,模拟器和设备。

如果您更喜欢控制台而不是视觉工具,那么您会很高兴知道UIKit包含了不错的日志记录API。 小问题-该API是私有的。 但是我们无论如何都不会在发行版中使用调试功能。

  -[UIView recursiveDescription] 

—以方便的形式打印UIView层次结构:

  (lldb)po [view recursiveDescription] <UIView:0x7faa328013c0; 框架=(0 0; 414736); 自动调整大小= W + H; 层= > 
<UILabel:0x7faa328045d0; 框架=(175198; 95 21); 文字=“您好,世界!”; 不透明=不; 自动调整大小= RM + BM; userInteractionEnabled =否; 层= >
<UIButton:0x7faa2f408000; 框架=(152 325; 50 30); 不透明=不; 自动调整大小= RM + BM; 层= >

每个UIView节点都包括布局和图形信息,CALayer以及其他特定字段。

  -[UIViewController _printHierarchy] 

UIViewController的类似方法 包括演示信息:

  (lldb)po [viewController _printHierarchy] ,状态:消失,视图:不在窗口中 
,状态:消失,视图:不在窗口中

,状态:消失,视图:不在窗口中
+ ,状态:出现,视图:,显示为:

,状态:出现,视图:

  • 符号表示子视图控制器;
  • +代表模态演示。

_printHierarchy方法在UIWindow的rootViewController上调用时特别有用:

  (lldb)po [[[[UIWindow keyWindow] rootViewController] _printHierarchy] 

值得一提的是-在Swift中,控制台的行为视情况而定:

  • 当程序从调试栏暂停执行时,我们可以使用Objective-C语法进行消息传递,例如po [view recursiveDescription]将起作用( 前提是您有权访问view变量或知道地址
  • lldb在断点停止时,必须使用Swift语法: po view.recursiveDescription()

当然,如果不公开公开私有API,您将无法在Swift中使用它们:

核心动画模板可衡量应用程序的图形性能。 在此示例中,我们仅关注渲染性能。 我的应用程序是带有自定义单元格的UITableView。 目前,它仅显示节和行。

我注意到滚动性能不是那么平稳。 使用Instruments对应用程序进行性能分析表明,我的性能远不及60 FPS。 当我滚动(第4-23秒)时,性能下降到44 FPS-比目标低16 FPS,降低了27%。

我怀疑问题出在我的单元格渲染上。 启用“ 颜色混合层”调试选项后,我可以更好地了解正在发生的事情。

彩色混合图层显示启用了混合的视图图层,这些视图图层相互绘制。

要了解为什么这是一个问题,我们需要知道如何创建最终图像。 用户看到的最终像素是在坐标处混合顶部像素和基础像素的组合。 这意味着必须渲染每个视图层才能创建最终图像。 当视图层不透明时,可以通过不绘制基础层来优化混合。

要创建圆角和阴影,我使用CALayer属性:

 让cardView = UIView() 
cardView.layer.cornerRadius = 10.0
cardView.layer.shadowColor = UIColor.black.cgColor
cardView.layer.shadowOpacity = 0.5
cardView.layer.shadowOffset = CGSize(宽度:0.0,高度:2.0)
cardView.layer.shadowRadius = 4.0

这使我的视图层的各个部分透明,从而导致不必要的混合。 由于背景是彩色填充,因此可以优化渲染。 我将在我的视图上设置纯色背景,并使用不带Alpha的背景图片:

 让cardView = UIImageView(image:UIImage(named:“ cardBackground”)) 

一个简单的技巧使我摆脱了混合:

现在的性能为58–59 FPS,滚动感觉很流畅。

最好的部分是,您可以从iOS模拟器快速访问颜色混合图层

UIKit特别是对辅助功能提供了令人印象深刻的支持。 当事情无法正常工作时,Xcode提供了Accessibility Inspector

除了调试之外,该工具还可以对您的应用执行审核并突出显示各种问题,例如动态类型支持。

Accessibility Inspector隐藏在Xcode> Open Developer Tool> Accessibility Inspector中。

Pixie将帮助您实现像素完美的设计。 这个小工具可让您从字面上检查应用程序的每个像素:

可以从Apple Developer网站(Xcode>打开开发者工具>更多开发者工具…)的Xcode附加工具包中下载Pixie


感谢您的阅读。 如果您喜欢这篇文章,请关注我并分享。

阅读我最新的文章“ Swift中的并发性:读者作家锁”。

向作者显示更多❤️与👏’s

希望下次见you

dmytro-anokhin(Dmytro Anokhin)

dmytro-anokhin有6个可用的存储库。 在GitHub上遵循他们的代码。

github.com