奇怪的 UINavigationBar 行为?

Posted

技术标签:

【中文标题】奇怪的 UINavigationBar 行为?【英文标题】:Strange UINavigationBar behavior? 【发布时间】:2013-11-20 15:29:48 【问题描述】:

在我的应用程序中,我有一个窗口 tintColor 将所有内容设置为红色。用户按下根视图控制器上的条形按钮项(红色项),它会呈现一个带有导航栏(红色导航项)的 UIModalPresentationSheet。在那个导航项上按下一个按钮,它会拉出一个完整的模态视图,现在这个模态视图也有一个导航栏,但所有的导航项都是灰色的;它们是可用的,并且仍然运行正确的功能,但它们的颜色是灰色的。知道为什么吗?起初我尝试使用灰色按钮以编程方式执行此操作,然后我通过情节提要完成并直接在场景中为导航项目着色,它们看起来是红色的,但在启动时,它们在模态视图上是灰色的。谁能告诉我为什么??

以下是模态视图的呈现方式:

- (void)barButtonItemPressedOnUIModalPresentationSheet 

    asdfVC *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"showAsdf"];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    [self presentViewController:navigationController animated:YES completion:nil];

奇怪的是,我在正确的 VC 类中设置了导航色调、按钮色调,甚至视图色调,但它似乎完全忽略了它。可能是因为我在其上设置了一个导航栏之前呈现它?

【问题讨论】:

【参考方案1】:

您可以尝试使用appearance 属性为整个应用程序设置颜色。 在 AppDelegate 中设置它,UI 将在所有视图上看起来都一样。

要将tintColor 设置为红色,请使用:

[[UINavigationBar appearance]setTintColor:[UIColor redColor];

[[UIBarButtonItem appearance]setTintColor:[UIColor redColor];

您还可以查看以下代码以获得更多自定义:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]setTintColor:[UIColor redColor]];

【讨论】:

【参考方案2】:

您可以在 AppDelegate.h 类中创建 UINavigationController 的属性。

@property (strong, nonatomic) UINavigationController *navigationController;

在您的 AppDelegate.m 类中,在 didFinishLaunchingWithOptions 方法中编写以下代码

self.navigationController=[[UINavigationController alloc]initWithRootViewController:self.UIModalPresentationSheet];
self.window.rootViewController = self.navigationController;

现在在 UIModalPresentationSheet 类的 ViewDidLoad 方法中编写此代码

-(void)viewDidLoad

   [super viewDidLoad];
   self.navigationController.navigationBar.tintColor = [UIColor redColor];

希望它会奏效。

【讨论】:

我的应用委托中没有 UIModalPresentationSheet,因此它给了我一个错误“在 appdelegate 类型的对象上找不到属性 UIModalPresentationSheet。” 你的 UIModalPresentationSheet 是 ViewController 类型?请解释【参考方案3】:

您能否尝试在视图控制器和显示绿色的导航栏上设置色调颜色:

viewController.view.tintColor = [UIColor redColor];
viewController.navigationController.navigationBar.tintColor = [UIColor redColor];

【讨论】:

这很奇怪!!!我的课上确实有这个,但按钮是灰色的!!!!难道是我在实际呈现视图控制器之前设置了导航栏?【参考方案4】:

我在我的应用程序中遇到了完全相同的异常情况,并且尝试了您尝试过的所有方法。我已经在 viewWillAppear 和 viewDidAppear 中放置了使颜色为蓝色(在我的情况下)的代码,但似乎没有任何东西可以解决它。我的猜测是这是一个 ios 错误。

【讨论】:

非常不幸。我已经向苹果提交了错误报告,希望它尽快得到修复!【参考方案5】:

发生这种情况是因为 Apple 假设我们不会呈现超过 1 个视图控制器,并将背景和所有条形按钮项(不知道为什么)调暗作为默认行为以将焦点放在最前面的视图上。

要解决此问题,您只需在 DidFinishLaunchingWithOptions 中将应用程序窗口上的 tintAdjustmentMode 强制设置为 Normal。

self.window.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;

【讨论】:

以上是关于奇怪的 UINavigationBar 行为?的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout 奇怪的行为 iOS

拆分视图控制器导航栏的奇怪行为

.clone(true,true) + .remove() 的 Jquery ui 奇怪行为

带有调整大小的表的 jQuery UI 可丢弃奇怪行为

jquery-ui 对话框不居中,关闭按钮奇怪的行为

由于奇怪的 UINavigationBar 视图层次结构,自定义 UINavigationBar 不起作用