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的导航栏样式设置为“不透明”,并将其设置为“颜色”而不是“纯色”。