基类+自定义导航条(iOS 11 & iPhone X适
2017-11-01 本文已影响246人
ShenYj
曾经写过一个基类控制器, 封装了一个自定义的NavigationBar, 如今原工程直接跑在iOS 11上的效果:
iOS 11默认.png感觉整体向上移动了20个点, 正好是状态栏的高度, 不过仔细看层级结构对照可以发现, 导航栏的高度还是64, 内部的子视图向上移动了导航栏高度的距离.
在自定义的UINavigationBar中,遍历找到需要的控件,对size.height
和origin.y
做相应调整,注意版本适配, iOS10之前使用的是_UINavigationBarBackground
, iOS10起改为_UIBarBackground
iOS 10:
<JSNavigationBar: 0x10181f3e0; baseClass = UINavigationBar; frame = (0 0; 375 64); opaque = NO; layer = <CALayer: 0x1c4036fc0>>
| <_UIBarBackground: 0x101824e60; frame = (0 0; 375 44); userInteractionEnabled = NO; layer = <CALayer: 0x1c402ffc0>>
| | <UIImageView: 0x10180a960; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x1c4030420>>
| | <UIVisualEffectView: 0x10180b300; frame = (0 0; 0 0); layer = <CALayer: 0x1c40302c0>>
| | | <_UIVisualEffectBackdropView: 0x1018564f0; frame = (0 0; 0 0); autoresize = W+H; userInteractionEnabled = NO; layer = <UICABackdropLayer: 0x1c422fe00>>
| | | <_UIVisualEffectSubview: 0x10185a730; frame = (0 0; 0 0); autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x1c42308e0>>
| | | <_UIVisualEffectSubview: 0x10185a930; frame = (0 0; 0 0); alpha = 0.85; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x1c42309a0>>
| <_UINavigationBarLargeTitleView: 0x100732f70; frame = (0 0; 375 64); clipsToBounds = YES; hidden = YES; layer = <CALayer: 0x1c0225e40>>
| | <UILabel: 0x100733470; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1c0092a20>>
| <_UINavigationBarContentView: 0x101831fd0; frame = (0 0; 375 44); layer = <CALayer: 0x1c4038180>>
| | <_UIButtonBarStackView: 0x101810f90; frame = (0 0; 0 0); layer = <CALayer: 0x1c42208e0>>
| | | <_UITAMICAdaptorView: 0x10185c430; frame = (0 0; 33 32); autoresizesSubviews = NO; layer = <CALayer: 0x1c4231200>>
| | | | <UIButton: 0x10184f9c0; frame = (0 0; 33 32); opaque = NO; layer = <CALayer: 0x1c422c220>>
| | | | | <UIButtonLabel: 0x10184fed0; frame = (0 0; 0 0); hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1c40922a0>>
| | <UILabel: 0x101830470; frame = (0 0; 0 0); text = '首页'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1c408d6b0>>
| <_UINavigationBarModernPromptView: 0x100733920; frame = (0 0; 375 64); alpha = 0; hidden = YES; layer = <CALayer: 0x1c0226460>>
| | <UILabel: 0x100733b20; frame = (0 0; 0 0); text = ''; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1c0092b60>>
Eailier:
<JSNavigationBar: 0x7f9657c5cee0; baseClass = UINavigationBar; frame = (0 0; 414 64); opaque = NO; gestureRecognizers = <NSArray: 0x7f9657d93050>; layer = <CALayer: 0x7f9657caa000>>
| <_UINavigationBarBackground: 0x7f9657cae8d0; frame = (0 0; 414 64); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7f9657ca2200>>
| | <_UIBackdropView: 0x7f9657f3d4b0; frame = (0 0; 414 64); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <_UIBackdropViewLayer: 0x7f9657e19b80>>
| | | <_UIBackdropEffectView: 0x7f9657e0c090; frame = (0 0; 414 64); clipsToBounds = YES; opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CABackdropLayer: 0x7f9657e18cb0>>
| | | <UIView: 0x7f9657e1f020; frame = (0 0; 414 64); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x7f9657e1fc60>>
| | | <UIView: 0x7f9657f3dab0; frame = (0 0; 414 64); alpha = 0.85; opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x7f9657f3dc20>>
| | <UIImageView: 0x7f9657ca1a30; frame = (0 64; 414 0.333333); userInteractionEnabled = NO; layer = <CALayer: 0x7f9657ca3d20>>
| <UINavigationItemView: 0x7f9657c96110; frame = (189 28; 36 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7f9657c643c0>>
| | <UILabel: 0x7f9657c962c0; frame = (0 2.33333; 36 22.6667); text = '首页'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7f9657c95560>>
| | | <_UILabelContentLayer: 0x7f9657f0c940> (layer)
| <UIButton: 0x7f9657f181d0; frame = (20 26; 32 32); opaque = NO; layer = <CALayer: 0x7f9657f0f820>>
| | <UIButtonLabel: 0x7f9657f08a70; frame = (0 6.33333; 32 19.3333); text = '首页'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7f9657f12490>>
| | | <_UILabelContentLayer: 0x7f9657da0df0> (layer)
| <_UINavigationBarBackIndicatorView: 0x7f9657f3f270; frame = (12 31.6667; 13 21); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7f9657f3eff0>>
适配代码:
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat systemVersion = [UIDevice currentDevice].systemVersion.floatValue;
for (UIView *view in self.subviews) {
if (systemVersion >= 11.0) {
if ([view isKindOfClass:NSClassFromString(@"_UIBarBackground")]) {
NSLog(@"_UIBarBackground");
CGRect frame = view.frame;
frame.size.height = 64;
if (IS_IPHONE_X) {
frame.origin.y = 24;
}
view.frame = frame;
NSLog(@"修改后的Frame: %@",NSStringFromCGRect(view.frame));
}
if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarContentView")]) {
NSLog(@"_UINavigationBarContentView");
CGRect frame = view.frame;
frame.origin.y = 20;
if (IS_IPHONE_X) {
frame.origin.y = 44;
}
view.frame = frame;
}
}
}
}
这样iOS 11下就恢复正常了