自定义导航栏隐藏按钮

Posted

技术标签:

【中文标题】自定义导航栏隐藏按钮【英文标题】:Customized navigation bar hides buttons 【发布时间】:2011-05-06 16:59:40 【问题描述】:

希望你也能帮忙解决这个问题... 我想通过添加自定义背景图片来自定义我的导航栏。我发现了一个完美但有点复杂的方法,叫做:NavigationSwizzle。在之前的项目中,我没有任何严重的问题,但现在我被卡住了......

从我的 AppDelegate 我调用这个静态方法:

@implementation SCAppUtils
+ (void)customizeNavigationController:(UINavigationController *)navController

//Customizing navigation BAR
UINavigationBar *navBar = [navController navigationBar];
[navBar setTintColor:kSCNavBarColor];

//Customizing TOOLBAR
[navController setToolbarHidden:NO animated:YES];

UIToolbar *toolBar = [navController toolbar];

UIImageView *imageView = (UIImageView *)[navBar viewWithTag:kSCNavBarImageTag];
UIImageView *imageView2 = (UIImageView *)[toolBar viewWithTag:kSCNavBarImageTag];

if (imageView == nil)

    Utilities *utilities = [[Utilities alloc]init];

    UIImage *img = [UIImage imageNamed:@"nav-bar-background.png"];
    UIImage *img2 = [UIImage imageNamed:@"toolbar-background.png"];

    imageView = [[UIImageView alloc] initWithImage:img];
    imageView2 = [[UIImageView alloc] initWithImage:img2];  

    [imageView setTag:kSCNavBarImageTag];
    [imageView2 setTag:kSCNavBarImageTag];

    [navBar insertSubview:imageView atIndex:0];
    [toolBar insertSubview:imageView2 atIndex:0];   

    [imageView release];
    [imageView2 release];
    [utilities release];


在调用第二个视图控制器后,在 rootNavigationController 中,我的右键,self.title,activityIndi​​cator 不显示。如果我在 [navBar insertSubview:imageView atIndex:0]; 行中评论或设置 atIndex:-1 然后按钮显示,但我的自定义背景消失了,我得到了普通的 iPhone导航标签。

rootNavigationControllerdidSelectRowAtIndex 中,我有:

//ADD BACK BUTTON TO VIEW
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Home" style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton; 

//Home Button color
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:166.0 / 255 green:179.0 / 255 blue:191.0 / 255 alpha:1.0];

//PUSH TO NEXT VIEW
[self.navigationController pushViewController:detailViewController animated:YES];

提前谢谢你...

如果您需要更多代码或解释,请随时问我...

最好的问候, 卢卡

编辑:

好的,我可以让这个问题变得更简单。我的导航栏中有一个自定义背景图像。这张图明显覆盖了我的

self.navigationItem.title = @"TITLE";

如果我将 alpha 设置为:背景中 imageView 的 0.3,我可以看到我的标题:

imageView = [[UIImageView alloc] initWithImage:image];
[imageView setAlpha:0.3];
[imageView setTag:kSCNavBarImageTag];
[navBar insertSubview:imageView atIndex:0];

所以问题是如何将我的 navigationItem.title 发送到前面?它是 UIView 类的后代吗?

编辑 2: 真正奇怪的是,标题在 rootController 中是可见的(在背景图像上方),但在推动另一个 viewController 标题后,它会出现在背景 imageView 后面?!

【问题讨论】:

【参考方案1】:

老实说,我认为您忘记在 main.m 中添加此代码。您的 main.m 应该如下所示:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "SCClassUtils.h"

int main(int argc, char *argv[])

    [SCClassUtils swizzleSelector:@selector(insertSubview:atIndex:)
                          ofClass:[UINavigationBar class]
                     withSelector:@selector(scInsertSubview:atIndex:)];
    [SCClassUtils swizzleSelector:@selector(sendSubviewToBack:)
                          ofClass:[UINavigationBar class]
                     withSelector:@selector(scSendSubviewToBack:)];

    @autoreleasepool 
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    

【讨论】:

我希望我没有回答这个问题太晚了 :)【参考方案2】:

您可能想试试这个来自定义您的导航栏。我在我的应用程序中使用它,它就像一个魅力

UIImage *theImage = [UIImage imageNamed:@"barImage.png"];
[self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:theImage] autorelease] atIndex:0];

看看这是否解决了您的按钮不显示的问题。

【讨论】:

感谢您的回答,但子视图是我试图避免的,因为我希望我的导航栏更加灵活,以便它可以采用,例如,在点击时设置在中间的自定义按钮打开 Safari ...我必须在我的情况下使用方法 swizzling ...再次感谢【参考方案3】:

我为我的工作找到了解决方案。使用符合导航栏的所有图像和颜色创建一个视图(viewBackground),然后将其转换为图像并将其用作背景

UIGraphicsBeginImageContextWithOptions(viewBackground.bounds.size, viewBackground.opaque, 0.0);
[viewBackground.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[[UINavigationBar appearance]            setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];

【讨论】:

以上是关于自定义导航栏隐藏按钮的主要内容,如果未能解决你的问题,请参考以下文章

iOS 导航栏-返回按钮-自定义

uni-app 自定义组件ADTabBar 底部导航栏 支持中间自定义按钮 支持小程序

uni-app APP端隐藏导航栏自定义按钮

隐藏导航栏但保留后退按钮 - SwiftUI

如何隐藏/显示自定义导航栏?

如何让自定义导航控制器为每个故事板提供相同的自定义导航栏按钮