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,内部的子视图向上移动了导航栏高度的距离。


 
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; } } } } 

之后便正常了


 
image.png

有时设置BackgroundImage也可以

    [_myNavBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

猜你喜欢

转载自www.cnblogs.com/chenweb/p/10423513.html
今日推荐