17

当我使用 aUIActivityViewController时,在用户选择一个活动(例如邮件或消息)后,我无法更改状态栏的文本颜色,也无法更改取消和发送导航栏按钮的文本/色调颜色。对于条形按钮,在AppDelegate我尝试过使用:

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

什么也没有发生。但是我可以用这个设置导航栏标题:

    [[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor, nil]];

我在. UIViewControllerBasedStatusBarAppearance_ 并把这条线:NOInfo.plist

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

AppDelegate,并且根本没有改变状态栏颜色的运气。有任何想法吗?

4

6 回答 6

7

由于 UIActivityViewController 呈现底层模型视图控制器,我们使用此解决方法来修复状态栏颜色问题:

@interface StatusBarColorApplyingActivityViewController : UIActivityViewController

@end

@implementation StatusBarColorApplyingActivityViewController

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
  [super presentViewController:viewControllerToPresent animated:flag completion:^{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    if (completion) {
      completion();
    }
  }];
}

@end

如您所见,这只是一个扩展 UIActivityViewController 的类,覆盖了presentViewController:animated:completion:. 当视图控制器出现时,我们通过 UIApplication 在完成块中设置状态栏样式。然后我们调用给该方法的原始完成块,如果有的话。

于 2014-07-23T11:19:26.413 回答
4

UIActivityViewController我们可以在呈现导航栏时更改导航栏的 tintColor 并在完成时恢复它,而不是从completionHandler. 例如:

UIColor *normalColor = [[UINavigationBar appearance] tintColor];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil];
[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) {
      // back to normal color
     [[UINavigationBar appearance] setTintColor:normalColor];
}];

[self presentViewController:activityViewController animated:YES completion:^{
     // change color to suit your need
     [[UINavigationBar appearance] setTintColor:[UIColor colorWithRed:25.0f/255.0f green:125.0f/255.0f blue:255.0f/255.0f alpha:1.0f]]; // ActionSheet options' Blue color
}];
于 2014-09-02T12:36:27.647 回答
2

在 iOS 8 中,UIActivityViewController在应用程序的根视图控制器上显示其单独的组合控制器。

您需要子类化您的根视图控制器(无论是 UIViewController 还是 UINavigationController)并添加以下代码。

@interface UINavigationControllerBarColor : UINavigationController

@end

@implementation UINavigationControllerBarColor

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    [super presentViewController:viewControllerToPresent animated:flag completion:^{
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
        if (completion) {
            completion();
        }
    }];
}

@end

然后不是在 AppDelegate 或情节提要中初始化 UINavigationController,而是初始化新的子类控制器。

其他一些建议是 UIActivityViewController 的子类,但这不起作用。

如果您想更改栏按钮和标题颜色,请在您的应用程序中使用以下内容:didFinishLaunching:

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                      [UIColor whiteColor], UITextAttributeTextColor,
                                                      [UIFont systemFontOfSize:18.0f], UITextAttributeFont,
                                                      nil]];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:[UIColor whiteColor]];
于 2015-02-07T02:04:33.050 回答
2

我相信更改导航栏颜色的代码是这样的:

[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];

如果您可能需要,这是用于更改 iOS 7 中导航栏按钮的颜色:

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

如果您想更改 iOS 6 中按钮的颜色,代码如下:

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

此代码还适用于 iOS 8+ 以更改 UIActivityViewController 活动的栏按钮文本颜色(例如通过消息或邮件编辑器共享)。

于 2013-11-21T12:12:28.420 回答
0

我找到了一个解决方案来更改发送取消按钮的文本颜色。

从这里检查我的答案。

关于将状态栏样式从黑色更改为白色,我几乎尝试了 Stackoverflow 上的所有内容,但没有任何效果。似乎没有解决方法。

一件事可能有效,但我真的不知道如何使用它,可能是更改子视图控制器中的状态栏样式。这里有一篇关于它的 Stackoverflow 帖子。

这可能仅在假设MFMailComposerViewControllerMFMessageComposeViewController是子视图控制器的情况下才有效UIActivityViewController,因此如果我们为 指定状态栏样式,UIActivityViewController则子视图控制器应具有与父视图控制器相同的状态栏样式。

UIViewController在被调用中有一个方法childViewControllerForStatusBarStyle是它的 Apple 文档。

但我真的不知道如何使用它。有没有人弄清楚这一点?

于 2014-04-12T20:48:13.437 回答
-1

您必须设置整个应用程序的 tintColor。

self.window.tintColor = [UIColor redColor];

或者

self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

条形按钮

self.navigationController.navigationBar.tintColor = [UIColor redColor];
于 2013-11-26T04:52:50.527 回答