iOS遍歷打印所有子視圖

有時候搞研究啊,需要找找一個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


查看作者首頁

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,593評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,554評論 0 17
  • 2017.02.22 可以練習,每當這個時候,腦袋就犯困,我這腦袋真是神奇呀,一說讓你做事情,你就犯困,你可不要太...
    Carden閱讀 1,378評論 0 1
  • 1.工作區和版本庫 2.git的安裝和配置 進入git官網下載安裝 用戶信息配置 查看配置信息 獲取幫助 1.gi...
    饞中解禪閱讀 320評論 0 0
  • 小結 - 上學;練琴,寫譜。 明日計劃 - 上學;練琴。
    301Cl閱讀 263評論 0 5