iOS 7:为整个应用程序禁用UINavigationBar Translucency

时间:2013-09-18 22:19:10

标签: ios uinavigationbar ios7

有没有办法为整个应用程序禁用UINavigationBar Translucency?

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

我已尝试[[UINavigationBar appearance] setTranslucent:NO],但令人惊讶的是不支持该功能。这样做会产生Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzlesForSetter:'

如果我必须,我可以通过我的整个应用程序设置UINavigationBars来逐个禁用半透明,但必须有一些更优雅的解决方案...

9 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:15)

如果您想将此样式应用于整个应用程序,这是一个Swift解决方案。

AppDelegate课程中的

将此内容添加到didFinishLaunchingWithOptions

对于Swift 2:

UINavigationBar.appearance().translucent = false

对于Swift 3:

UINavigationBar.appearance().isTranslucent = false

答案 2 :(得分:7)

appDelegate didFinishLaunchingWithOptions中的此代码似乎非常简单(适用于iOS 8及以上版本)

[[UINavigationBar appearance] setTranslucent:NO];

答案 3 :(得分:3)

我认为您对此属性没有外观代理是正确的。您使用的是UINavigationControllers还是UINavigationBar对象?如果您使用的是UINavigationBars,您可以将其子类化并创建一个非半透明的导航栏。

标题文件:

#import <UIKit/UIKit.h>

@interface ABCNonTranslucentNavBar : UINavigationBar

@end

实施档案:

#import "ABCNonTranslucentNavBar.h"

@implementation ABCNonTranslucentNavBar

- (void)drawRect:(CGRect)rect
{
  [self setTranslucent:NO];
}

然后用你的子类替换UINavigationBars。您还可以使用子类UINavigationController执行类似的操作。

答案 4 :(得分:3)

添加此内容以防任何人仍在与此作斗争。

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

[[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];

答案 5 :(得分:2)

我知道这已经过时了,但这对某人来说可能会派上用场;

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

@implementation UINavigationBar (MakeTranslucent)

-(void)willMoveToWindow:(UIWindow *)newWindow {
    [super willMoveToWindow:newWindow];


    self.translucent = NO;
}
@end
  • 我用过willMoveToWindow,我不知道这是不是一个好主意所以UAYOR。

答案 6 :(得分:0)

我认为外观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 ;

答案 7 :(得分:0)

请参见UIKit代码文档的摘录:

/*
     New behavior on iOS 7.
     Default is YES.
     You may force an opaque background by setting the property to NO.
     If the navigation bar has a custom background image, the default is inferred 
     from the alpha values of the image—YES if it has any pixel with alpha < 1.0
     If you send setTranslucent:YES to a bar with an opaque custom background image
     it will apply a system opacity less than 1.0 to the image.
     If you send setTranslucent:NO to a bar with a translucent custom background image
     it will provide an opaque background for the image using the bar's barTintColor if defined, or black
     for UIBarStyleBlack or white for UIBarStyleDefault if barTintColor is nil.
     */

正确的Swift 4解决方案是

UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().backgroundColor = .white

答案 8 :(得分:-3)

如果您不使用故事板,而是使用IB,请将MainWindows.xib的导航栏样式设置为NOT半透明,并将其设置为颜色而不是透明色。