引
有時候搞研究啊,需要找找一個View有哪些子View,主要是分別是什么類型的,這種事情用遞歸來做比較好。
我稍微將這個打印做的更友好了一點,效果大致是這樣的:
image.png
前面的序號表示所在的層級,同時還有一個縮進,讓人對層級看得更清楚,序號后面的就是子View的類型了。
實現
其實實現起來很簡單,用遞歸,我們通過 [UIView subviews] 方法就可以獲取一個 view 的所有子view,對于每一個子view,我們又去遞歸調用這個方法看看他有沒有子view,有就繼續調用,繼續對每一個子view判斷,沒有才往下走打印下一個同層級的子view。
這樣可以保證打印出來的順序就是每個子view下緊跟著打印他的所有子view。
至于序號、空格縮進這些,就是一些更人性化的做法了,實現起來也很簡單,直接看代碼:
// 遞歸獲取子視圖
- (void)getSub:(UIView *)view andLevel:(int)level {
NSArray *subviews = [view subviews];
// 如果沒有子視圖就直接返回
if ([subviews count] == 0) return;
for (UIView *subview in subviews) {
// 根據層級決定前面空格個數,來縮進顯示
NSString *blank = @"";
for (int i = 1; i < level; i++) {
blank = [NSString stringWithFormat:@" %@", blank];
}
// 打印子視圖類名
NSLog(@"%@%d: %@", blank, level, subview.class);
// 遞歸獲取此視圖的子視圖
[self getSub:subview andLevel:(level+1)];
}
}
我們在想知道一個view的所有子view層級的時候只需要直接調用這個方法就可以了:
// 打印所有子視圖
[self getSub:self.navigationController.navigationBar andLevel:1];
需要注意的是,我的level設置是從1開始的,這與方法中加空格時變量 i 起始的值是相呼應的,要改就要都改。
這里我只打印了子view的類型,其實還可以知道它們的frame等信息,只需要在打印時將 subview.class 改成直接打印 subview 就可以了,就能得到這個 subview 的所有信息。
結
雖然遞歸打印網上的方法很多,但簡單的東西也可以做的更人性化一點~
示例工程:https://github.com/Cloudox/ViewSubViewsDemo