前些天,Ryan Peterson 在看 UIKit 的私有頭文件時發(fā)現(xiàn)了一個之前沒看過的類: UIDebuggingInformationOverlay,并把這個發(fā)現(xiàn)分享了出來,下面來看看這個類具體的作用。
從類名可以大致知道它是用來 debug 用的。是的,UIDebuggingInformationOverlay 是 UIWindow 的一個子類,主要是用來給開發(fā)者和設(shè)計師進(jìn)行UI調(diào)試用的(估計是Apple內(nèi)部人員使用的)。
它大概是長這樣的:

怎么用呢?首先我們得讓它顯示出來,通過類方法 prepareDebuggingOverlay 加載下這個視圖,然后又兩種方式可以讓它顯示:
1.調(diào)用 overlay 方法,拿到實例,再調(diào)用實例方法 toggleVisibility 即可顯示。因為是私有API所以需要用運(yùn)行時的方式來執(zhí)行,代碼如下:
// Objective-C
Class overlayClass = NSClassFromString(@"UIDebuggingInformationOverlay");
[overlayClass performSelector:NSSelectorFromString(@"prepareDebuggingOverlay")];
Class overlay = [overlayClass performSelector:NSSelectorFromString(@"overlay")];
[overlay performSelector:NSSelectorFromString(@"toggleVisibility")];
// 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"))
2.執(zhí)行了prepareDebuggingOverlay方法之后,只需要通過 兩個手指同時點(diǎn)擊頂部狀態(tài)欄 即可喚醒這個浮層。

顯示出來后,再看看具體能做什么。
View Hierarchy
顯示視圖的層級關(guān)系,點(diǎn)擊又上角的 Inspect 可以進(jìn)行App的視圖的選擇,并查看視圖的詳細(xì)信息。如果你對 App 有多個 window,可以通過 Change Current Window 進(jìn)行切換查看不同 window 的視圖層級關(guān)系及各個視圖的詳細(xì)信息。同樣的,你也可以查看系統(tǒng)的 window。比如下面查看系統(tǒng)鍵盤這個 window:

VC Hierarchy
和 View Hierarchy 類似,你可以查看每個 VC 的層級,并且可以查看每個 VC 上視圖的詳細(xì)信息,同時,還提供了所查看的 VC 是否 presenting 了 modal 或者是被 presented。

Ivar Explorer
Ivar Explorer 可以讓開發(fā)者查看當(dāng)前 UIApplication 實例的變量。如下,如果變量是個對象,還可以查看對象內(nèi)部的變量,如:delegate, statusBar 等(后面即將介紹的兩個才是重頭戲)。

Measure
從名稱上可以知道,這是測量用的。是的,有了它,你就可以直接測量當(dāng)前視圖了。操作起來也很簡單:先選擇是要測量垂直的還是測量水平的,然后手指在屏幕上移動即可測量。如下:

另外,我們發(fā)現(xiàn),有個開關(guān)寫著View Mode,打開之后,就可以測量每個組件的寬高了,如下:

Spec Compare
這個功能更牛,更實用。設(shè)計師給你一張圖,你按著圖布局完后,想看看是否和UI圖一致,之前我都是截個圖,然后自己量。有了它,方便了多少自己體會哈。我們可以將UI圖添加進(jìn)來,然后手指向上下滑動來調(diào)節(jié)圖片的透明度(從下到上圖片透明度0~1),就可以看出哪些組件布局有問題了。
提示: 1. 添加圖片后,調(diào)試框會隱藏,雙擊屏幕即可重新顯示; 2. 由于添加圖片需要訪問圖片庫,所以需要在項目的plist文件上添加 Privacy - Photo Library Usage Description 這一項,描述內(nèi)容自定。
效果如下:

最后
以上,就是 UIDebuggingInformationOverlay 的基本使用,能否利用它來做更多調(diào)試的事情,就得靠自己去挖掘了。并附上Demo地址:
https://github.com/linshaolie/DebuggingOverlayDemo