iOS11自定义导航条上移处理

 

iOS11自定义导航条上移处理
image.png

在自定义导航条时,通常会继承系统的UINavigationBar,但如上图,在iOS11上,导航条改动了。
自定义导航条代码

    -(MBNavigationBar *)myNavBar{
        if (!_myNavBar) {
            _myNavBar = [[MBNavigationBar alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 64)];
            _myNavBar.barTintColor = [UIColor colorWithRed:245/255.0 green:245/255.0 blue:245/255.0 alpha:1.0];
            _myNavBar.translucent = NO;
        }
        return _myNavBar;
    }

高度设置为64,但看着高度只有44,而且上移到状态栏位置
不过仔细看层级结构对照可以发现,导航栏的高度还是64,内部的子视图向上移动了导航栏高度的距离。


 
iOS11自定义导航条上移处理
image.png

在自定义的UINavigationBar中,遍历找到需要的控件,对size.height和origin.y和相应调整,
版本适配:iOS10之前使用的是_UINavigationBarBackground,iOS10之后改为_UIBarBackground

    #define IS_IPHONE_X ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
    - (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")]) {
                            CGRect frame = view.frame;
                            frame.size.height = 64;
                            if (IS_IPHONE_X) {
                                frame.size.height = 88;
                            }
                            view.frame = frame;
                        }
                        if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarContentView")]) {
                            CGRect frame = view.frame;
                            frame.origin.y = 20;
                            if (IS_IPHONE_X) {
                                frame.origin.y = 44;
                            }
                            view.frame = frame;
                        }
                    }
                }
            }

之后便正常了


 
iOS11自定义导航条上移处理
image.png

有时设置BackgroundImage也可以

    [_myNavBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

iOS11自定义导航条上移处理

上一篇:ApplicationContext(四)BeanFactory 功能扩展


下一篇:iOS 感悟