iOS 10后新特性以及注意事项iOS开发你需要知道的iOS开发指南

基类+自定义导航条(iOS 11 & iPhone X适

2017-11-01  本文已影响246人  ShenYj

曾经写过一个基类控制器, 封装了一个自定义的NavigationBar, 如今原工程直接跑在iOS 11上的效果:

iOS 11默认.png

感觉整体向上移动了20个点, 正好是状态栏的高度, 不过仔细看层级结构对照可以发现, 导航栏的高度还是64, 内部的子视图向上移动了导航栏高度的距离.

在自定义的UINavigationBar中,遍历找到需要的控件,对size.heightorigin.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下就恢复正常了

上一篇 下一篇

猜你喜欢

热点阅读