【问题标题】:Custom Navigation Bar Giving Me Double Navigation Bars iN View自定义导航栏在视图中给我双导航栏
【发布时间】:2015-03-14 02:19:26
【问题描述】:

我正在尝试使用插件在我的应用程序中的 UINavigationBar 中使用渐变。我在https://github.com/chroman/CRGradientNavigationBar找到它

我的应用是一个 Tab Bar Controller 应用,其中每个选项卡都是一个 NavigationController。我的代码设置为:

UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[CRGradientNavigationBar class] toolbarClass:nil];

UIColor *firstColor = [UIColor colorWithRed:255.0f/255.0f green:42.0f/255.0f blue:104.0f/255.0f alpha:1.0f];
UIColor *secondColor = [UIColor colorWithRed:255.0f/255.0f green:90.0f/255.0f blue:58.0f/255.0f alpha:1.0f];

NSArray *colors = [NSArray arrayWithObjects:firstColor, secondColor, nil];
// or NSArray *colors = [NSArray arrayWithObjects:(id)UIColorFromRGB(0xf16149).CGColor, (id)UIColorFromRGB(0xf14959).CGColor, nil];

[[CRGradientNavigationBar appearance] setBarTintGradientColors:colors];
[[navigationController navigationBar] setTranslucent:NO]; // Remember, the default value is YES.

[navigationController setViewControllers:@[tabBarController]];

[self.window setRootViewController:navigationController];

但是,我得到了双导航栏,标题和 uibarbuttonitems 被添加到第二个,而不是渐变一个。有什么建议吗?

【问题讨论】:

    标签: ios ios7 ios8 uinavigationbar gradient


    【解决方案1】:

    UITabBarController 不应该是 rootViewController 和 UINavigationController。尝试将 tabBarController 设置为窗口的 rootViewController,如下所示:

    [self.window setRootViewController:tabBarController];
    

    然后你会想用导航控制器填充标签栏控制器上的 viewControllers 数组,这会导致每个标签都有自己的导航栏和视图控制器堆栈:

    UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[CRGradientNavigationBar class] toolbarClass:nil];
    [tabBarController setViewControllers:@[navigationController]];
    

    这将产生一个标签栏控制器,底部显示一个标签,顶部显示该标签的导航栏。如果您想要更多选项卡,只需将更多视图控制器实例添加到您在 tabBarController 上设置的 viewControllers 数组中:

    UINavigationController *navigationController1 = [[UINavigationController alloc] initWithNavigationBarClass:[CRGradientNavigationBar class] toolbarClass:nil];
    UINavigationController *navigationController2 = [[UINavigationController alloc] initWithNavigationBarClass:[CRGradientNavigationBar class] toolbarClass:nil];
    UINavigationController *navigationController3 = [[UINavigationController alloc] initWithNavigationBarClass:[CRGradientNavigationBar class] toolbarClass:nil];
    [tabBarController setViewControllers:@[navigationController1,navigationController2,navigationController3]];
    

    每个导航控制器都将从堆栈中至少 1 个 UIViewController 开始,如下所示:

    UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[CRGradientNavigationBar class] toolbarClass:nil];
    UIViewController* viewControllerForNavigationController = [UIViewController new];
    [navigationController setViewControllers:@[viewControllerForNavigationController]];
    

    【讨论】:

    • 这正是我设置它的方式。我的根是一个标签栏控制器。每个选项卡都有一个导航控制器。我的问题是,当从 github 添加这个子类 NavigationBar 时,它并没有代替每个选项卡的导航控制器的导航栏,而只是在其顶部添加一个新的导航栏。
    • 在您提供的代码中,标签栏控制器似乎是导航控制器上的视图控制器,并且您的导航控制器设置为窗口的根视图控制器:[navigationController setViewControllers:@[tabBarController ]]; [self.window setRootViewController:navigationController];
    • 你需要做相反的事情:将窗口的根视图控制器设置为标签栏控制器,并将导航控制器设置为标签栏控制器上的视图控制器 [tabBarController setViewControllers:@[navigationController] ]; [self.window setRootViewController:tabBarController];`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多