Navigationbar在两种类型的界面之间进行屏幕边缘拖动时,对navigationbar显示的控制

问题描述:

  • (1) 有两个界面,RootUI 和 SubUI;
  • (2) RootUI需要显示Navigationbar, 而SubUI不显示Navigationbar;
  • (3) 要进行的操作是:在SubUI中进行屏幕边缘拖拽操作,希望能够按照如下图所示的方式进行显示:
Navigationbar在两种类型的界面之间进行屏幕边缘拖动时,对navigationbar显示的控制_第1张图片
B83CEEF6-5C88-40C7-B157-EDACA4447AEA.png

实现思路:

  • 在 RootUI 界面的viewDidLoad方法中添加以下代码:
//业务界面的绘制区域不会向上超越navigationbar的区域,如果超越了的话,在向下滚动界面时,navigationbar的背景色同业务界面的色调有轻微的融合;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;
/*
相当于给navigationbar赋值一个背景色,
这样做的好处是:防止UINavigationController在做两个界面之间的边缘拖拽切换时,显示一些不必要的自动补全的动画效果。
*/
self.navigationController.view.backgroundColor = COLOR_THEME;
  • 在被push出来的SubUI界面中添加以下代码:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
//强行往navigationbar的背景上设置一张alpha=0的透明颜色的图片,这样SubUI界面的navigationbar就被透明了
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[COLOR_THEME colorWithAlphaComponent:0]] forBarMetrics:UIBarMetricsDefault];

//隐藏navigationbar底部的分割线
    UIImageView *navBarHairlineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar];
navBarHairlineImageView.hidden = YES;
        self.navigationController.navigationBar.translucent = YES;
}

//找到navigationbar底部的分割线
- (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
        return (UIImageView *)view;
    }
    for (UIView *subview in view.subviews) {
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];
        if (imageView) {
            return imageView;
        }
    }
    return nil;
}

你可能感兴趣的:(Navigationbar在两种类型的界面之间进行屏幕边缘拖动时,对navigationbar显示的控制)