iOS 5:您可以覆盖特定类中的UIAppearance自定义吗?

lms*_*lms 15 objective-c ios xcode4 ios5

我正在构建一个包含许多视图控制器的应用程序:我有一个UITabBarController容纳4个UINavigationController.我希望所有导航栏都是我的自定义颜色,比如蓝色,我通过在我的app委托中执行此操作来实现:

[[UINavigationBar appearance] setTintColor:[UIColor blueColor]];
Run Code Online (Sandbox Code Playgroud)

但我也有一个特殊的视图控制器,它有一个地图,对于这个视图控制器,我想覆盖蓝色导航栏设置UIAppearance使其成为黑色不透明样式.我试过在里面调用它viewDidLoad:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
self.navigationController.navigationBar.translucent = YES;
Run Code Online (Sandbox Code Playgroud)

但没有任何反应.可以这样做还是我必须放弃UIAppearance并navigationBar为每个视图控制器手动设置属性?

hyp*_*ypt 30

你这样做的方式应该有效,但事实并非如此.这确实有效:

斯威夫特4

UINavigationBar.appearance(whenContainedInInstancesOf: [YourOtherVC.self]).tintColor = .black
Run Code Online (Sandbox Code Playgroud)

Objective-C的

[[UINavigationBar appearanceWhenContainedIn:[YourOtherVC class], nil] setTintColor:[UIColor blackColor]];
Run Code Online (Sandbox Code Playgroud)


ste*_*vex 9

将您的更改移动到viewWillAppear:而不是viewDidLoad:它应该可以工作.


Dav*_*ong 1

为此你会这样做:

id specialNavBarAppearance = [UINavigationBar appearanceWhenContainedIn:[SpecialViewController class], nil];

[specialNavBarAppearance setBarStyle:UIBarStyleBlack];
[specialNavBarAppearance setTranslucent:YES];
Run Code Online (Sandbox Code Playgroud)

  • 在外观代理上调用 setTranslucent 实际上不起作用。它说“非法属性类型,调用选择器中的 c,_UIAppearance_setTranslucent:” (3认同)