行业动态
自定义导航栏的弊端:使用系统的UINavigationController是什么?
2021-03-16

系统导航栏的缺点:

使用系统的UINavigationController不能使每个控制器都有自己的独立导航栏。它们共享相同的导航栏。在一个控制器中更改了导航栏的属性,并在其他页面上看到了导航。列属性也已更改。

在通常情况下,使用系统导航栏在页面之间进行切换是没有问题的,但是如果您在不同页面之间遇到不同的导航栏样式(例如:第一页面导航栏是不透明的,第二页面导航栏是不透明的)是透明的),因此当您在页面之间进行切换时,会在导航栏切换之间看到明显的突变感。

系统导航栏效果:

您可以看到系统导航栏在第一个界面上是不透明的,而在第二个界面上是透明的。但是在从第二页切换到第一页的过程中,导航栏变得不透明,因此显得很尴尬。

ios开发自定义导航栏

nav 2. gif

如果希望每个页面都有其自己的独立导航栏并且不受其他页面的影响,则需要隐藏系统导航栏,并将页面上的UIView定制为伪造的导航栏。

由于自定义视图用作导航栏,因此请注意,自定义导航栏不会被其他控件遮挡。在这里,我使用主线程异步创建自定义导航栏,以便最后创建自定义导航栏,以便将其显示在顶层,而不会被其他控件遮盖。

自定义导航栏效果:

ios开发自定义导航栏

nav.gif

在National K歌曲应用程序中,您可以看到使用了这种导航栏效果。 Sing Bar(也是K歌曲软件)使用系统导航栏。相比之下ios开发自定义导航栏,我觉得Sing Bar导航栏的滑动效果更加难看。

自定义导航条形码:

可以在下面的距离中使用宏命令,以防止将来需要一次修改每个接口。

如果您认为为每个界面创建导航栏的代码很复杂,则可以创建一个父控制器,在该父控制器中创建一个导航栏,其他控制器也将从该父控制器继承。

// 创建“导航栏”
- (void)createNav{
    // 在主线程异步加载,使下面的方法最后执行,防止其他的控件挡住了导航栏
    dispatch_async(dispatch_get_main_queue(), ^{
        // 隐藏系统导航栏
        self.navigationController.navigationBar.hidden = YES;
        // 创建假的导航栏
        UIView *navView = [[UIView alloc] initWithFrame:CGRectMake(0, 20, [UIScreen mainScreen].bounds.size.width, 44)];
        [self.view addSubview:navView];
        // 创建导航栏的titleLabel
        UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0,44)];
        titleLabel.text = @"第二页";
        [titleLabel sizeToFit];
        titleLabel.frame = CGRectMake([UIScreen mainScreen].bounds.size.width / 2 - titleLabel.frame.size.width / 2, 0, titleLabel.frame.size.width, 44);
        [navView addSubview:titleLabel];
        // 创建导航栏右边按钮
        UIButton *right= [UIButton buttonWithType:UIButtonTypeSystem];
        [right setTitle:@"下一页" forState:UIControlStateNormal];
        right.frame = CGRectMake(300, 0, 100, 44);
        [right addTarget:self action:@selector(nextAction) forControlEvents:UIControlEventTouchUpInside];
        [navView addSubview:right];
        // 创建导航栏左按钮
        UIButton *left= [UIButton buttonWithType:UIButtonTypeSystem];
        [left setTitle:@"上一页" forState:UIControlStateNormal];
        [left addTarget:self action:@selector(preAction) forControlEvents:UIControlEventTouchUpInside];
        [navView addSubview:left];
        left.frame = CGRectMake(0, 0, 100, 44);
    });
}

// 导航栏右边按钮方法
- (void)nextAction{
    SecondViewController *vc = [[SecondViewController alloc] init];
    [self.navigationController pushViewController: vc animated:YES];
}
// 导航栏左边按钮方法
- (void)preAction{
    [self.navigationController popViewControllerAnimated:YES];
}

尽管代码很简单,但简单的想法使我们可以自由控制导航栏,这可以解决一些令人讨厌的产品要求,例如:根据需要更改导航栏的样式ios开发自定义导航栏,在导航上添加各种怪异的控件酒吧。

如果产品的多个模块中只有一个需要自定义导航栏,则其他模块可以选择继续使用系统导航栏。毕竟,在每个控制器中复制和粘贴如此多的代码很累人。

演示下载链接:


393701618