UINavigationBar層級

iOS 11.0 前

for(UIView *view in self.navigationController.navigationBar.subviews) {
        NSLog(@"%@", NSStringFromClass([view class]));
        for(UIView *subView1 in view.subviews) {
            NSLog(@"***%@", NSStringFromClass([subView1 class]));
            for(UIView *subView2 in subView1.subviews) {
                NSLog(@"*****%@", NSStringFromClass([subView2 class]));
            }
        }
    }
2017-09-15 09:21:56.275 AutoLayout-01[1077:41744] _UINavigationBarBackground
2017-09-15 09:21:56.275 AutoLayout-01[1077:41744] ***_UIBackdropView
2017-09-15 09:21:56.275 AutoLayout-01[1077:41744] *****_UIBackdropEffectView
2017-09-15 09:21:56.276 AutoLayout-01[1077:41744] *****UIView
2017-09-15 09:21:56.276 AutoLayout-01[1077:41744] ***UIImageView
2017-09-15 09:21:56.276 AutoLayout-01[1077:41744] _UINavigationBarBackIndicatorView
2017-09-15 09:21:56.276 AutoLayout-01[1077:41744] UINavigationItemView
2017-09-15 09:21:56.276 AutoLayout-01[1077:41744] ***UILabel
2017-09-15 09:21:56.276 AutoLayout-01[1077:41744] UINavigationButton
2017-09-15 09:21:56.276 AutoLayout-01[1077:41744] ***UIButtonLabel

分析下UINavigationBar層級

  1. _UINavigationBarBackground 這是一個UIImageView類型的背景視圖。設(shè)置bar的背景圖片,設(shè)置bar透明等都需要操作這個視圖。

1.1 _UIBackdropView:這個是渲染視圖,主要用來制作模糊效果。

_UIBackdropView is a private class in UIKit.framework (iOS 7.0+), a subclass of UIView, which is used for the popular blur effects.

它是_UINavigationBarBackground的子視圖。依賴于_UINavigationBarBackground存在。所以我們再設(shè)置bar透明的時候,直接

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

就相當(dāng)于把_UIBackdropView視圖移除了。然后顯示的只有_UINavigationBarBackground這個imageView了。

1.1.1 _UIBackdropEffectView這個是具體實(shí)施模糊效果的毛玻璃視圖。它是_UIBackdropView的子視圖。

1.1.2 UIView這個視圖是具體用來顯示bar前置色的視圖,我們設(shè)置setBarTintColor時就是設(shè)置的這個視圖。它也是_UIBackdropView的子視圖。

1.2 UIImageView:這個是bar底部的分割線。也是_UINavigationBarBackground的子視圖。

  1. _UINavigationBarBackIndicatorView、UINavigationItemView、UINavigationButton這三個就是返回按鈕、中間title和右邊的barItem,這三個是直接加在UINavigationBar上的。

iOS 11.0

看下輸出:

2017-09-15 10:11:36.235376+0800 AutoLayout-01[1420:123029] _UIBarBackground
2017-09-15 10:11:36.235549+0800 AutoLayout-01[1420:123029] ***UIImageView
2017-09-15 10:11:36.235663+0800 AutoLayout-01[1420:123029] ***UIVisualEffectView
2017-09-15 10:11:36.235759+0800 AutoLayout-01[1420:123029] *****_UIVisualEffectBackdropView
2017-09-15 10:11:36.235879+0800 AutoLayout-01[1420:123029] *****_UIVisualEffectSubview
2017-09-15 10:11:36.236161+0800 AutoLayout-01[1420:123029] _UINavigationBarLargeTitleView
2017-09-15 10:11:36.236288+0800 AutoLayout-01[1420:123029] ***UILabel
2017-09-15 10:11:36.236371+0800 AutoLayout-01[1420:123029] _UINavigationBarContentView
2017-09-15 10:11:36.236486+0800 AutoLayout-01[1420:123029] ***_UIButtonBarStackView
2017-09-15 10:11:36.236570+0800 AutoLayout-01[1420:123029] ***UILabel
2017-09-15 10:11:36.236665+0800 AutoLayout-01[1420:123029] _UINavigationBarModernPromptView
2017-09-15 10:11:36.236759+0800 AutoLayout-01[1420:123029] ***UILabel

在iOS 11.0 下,粗略的看bar的層級變成了2部分,第一部分還是_UIBarBackground,第二部分和iOS 11.0前的不同是把以前的幾個barItem放到了一個容器視圖_UINavigationBarContentView中。

  • 分析下第一部分_UIBarBackground:
    這玩意由以前的UIImageView類型變成了UIView類型的視圖,不知道現(xiàn)在設(shè)置背景圖片還是和以前一樣嗎?

  • _UIBackdropView現(xiàn)在沒了,直接就是UIVisualEffectView,并且上面加了3個_UIVisualEffectSubview的自視圖,現(xiàn)在還不知道為什么加這么多。

  • _UIButtonBarStackView:這個是右邊的barItem的類型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,397評論 4 61
  • 這句話之前背來是寫作文用的,當(dāng)現(xiàn)在開始讀點(diǎn)書的時候,再想起這句話,又有一番不一樣的感悟。 首先說下我很崇拜的人——...
    kwfs筆記閱讀 1,707評論 0 1
  • 地球依然在轉(zhuǎn) 時間仍舊還在流逝 一切都在按照原本的狀態(tài)進(jìn)行著 但你覺得這和你根本毫無關(guān)系 那個男人 他再打電話 那...
    趙同學(xué)zon閱讀 165評論 0 0
  • “穆熙妍,你回國怎么也不跟我說一聲??!我是不是你的閨蜜” “我現(xiàn)在不就回來了嗎,機(jī)場門口等我,記得開拉風(fēng)一點(diǎn)的車...
    幼稚園小小班biu閱讀 721評論 0 0
  • 在茫茫人海,在林蔭小道,在海邊,在河堤,在商場,在鬧市,不管你我他身處哪里,相逢一笑或擦肩而過,轉(zhuǎn)身離開后,相互間...
    云中飄舞閱讀 646評論 25 29

友情鏈接更多精彩內(nèi)容