iOS 7:禁用整个应用程序的UINavigationBar半透明

有没有办法来禁用整个应用程序的UINavigationBar半透明?

我知道使用[self.navigationController.navigationBar setTranslucent:NO]可以解决这个问题的单个控制器,但我有很多UINavigationBars在我的应用程序,这是一个非常乏味的解决scheme。

我试过[[UINavigationBar appearance] setTranslucent:NO] ,但是这个function令人惊讶地不被支持。 这样做会导致Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzlesForSetter:'

如果我有,我可以通过我的整个应用程序设置UINavigationBars禁用半透明一个接一个,但必须有一些更优雅的解决scheme,这个问题…

如果您将堆栈中的第一个导航栏的半透明设置为false [self.navigationController.navigationBar setTranslucent:NO] ,它将反映在所有推送到该堆栈的NavigationViewController中。

这是一个Swift解决scheme,如果你想将这个样式应用到整个应用程序。

AppDelegate类中添加这个到didFinishLaunchingWithOptions

对于Swift 2:

 UINavigationBar.appearance().translucent = false 

对于Swift 3:

 UINavigationBar.appearance().isTranslucent = false 

这个代码在appDelegate didFinishLaunchingWithOptions看起来很简单(在iOS 8和更高版本中工作正常)

 [[UINavigationBar appearance] setTranslucent:NO]; 

我想你是正确的没有外观代理可用于此属性。 你使用的是UINavigationControllers还是UINavigationBar对象? 如果您正在使用UINavigationBars,则可以对其进行子类化并创build非半透明的导航栏。

头文件:

 #import <UIKit/UIKit.h> @interface ABCNonTranslucentNavBar : UINavigationBar @end 

实施文件:

 #import "ABCNonTranslucentNavBar.h" @implementation ABCNonTranslucentNavBar - (void)drawRect:(CGRect)rect { [self setTranslucent:NO]; } 

然后,只需将UINavigationBarsreplace为您的子类。 你也可以做一些类似的子类UINavigationController。

添加这个以防万一还在与这个战斗。

你可以通过指定一个不存在的图像来欺骗它,这将导致导航栏,包括它的工具栏不透明

 [[UIToolbar appearance] setBackgroundColor:[UIColor colorWithRed:219.0/255.0 green:67.0/255.0 blue:67.0/255.0 alpha:1.0]]; [[UIToolbar appearance] setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; 

我知道这是旧的,但这可能会派上用场。

你可以使用一个类别,并在其中*设置属性[translucent][1]

 @implementation UINavigationBar (MakeTranslucent) -(void)willMoveToWindow:(UIWindow *)newWindow { [super willMoveToWindow:newWindow]; self.translucent = NO; } @end 
  • 我用willMoveToWindow,我不知道这是否是一个好主意,所以UAYOR。

我觉得外观API不支持导航栏的半透明属性。 但是你可以这样做这样的整个应用程序,请看看这个代码 –

这里菜单屏幕是一个根视图控制器。

 MenuScreen *ms = [[MenuScreen alloc]initWithNibName:@"MenuScreen" bundle:nil]; UINavigationController *nv = [[UINavigationController alloc]initWithRootViewController:ms]; //This will set property for whole App. [nv.navigationBar setTranslucent:NO]; self.window.rootViewController = nv ; 

如果您不使用Storyboard,而是使用IB,请将MainWindows.xib的导航栏样式设置为“不透明”,并将其设置为“颜色”而不是“纯色”。