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層級:
- _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的子視圖。
- _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的類型。