题 iOS 7中UIActivityViewControllers的模态状态栏和导航栏文本颜色


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

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

没有任何反应。但是我可以用这个设置导航栏标题:

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

我设定了 UIViewControllerBasedStatusBarAppearance 至 NO 在里面 Info.plist。并把线:

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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


17
2017-11-05 16:47


起源


我试过这个状态栏颜色 stackoverflow.com/questions/17678881/... - the1pawan
@ the1pawan我试过了。它只更改常规UIViewControllers的状态栏颜色,并且不影响从UIActivityViewController启动的活动的状态栏 - Henry Glendening
我向Apple请求了这方面的帮助,他们确认这是一个错误。我已经提交了一个错误报告,所以希望这将在iOS 7.1中得到修复。我建议在bugreport.apple.com上提交一份错误报告并参考我的15959753。 - Nick
这是固定的吗? - SRP-Achiever
似乎不是 - Halpo


答案:


由于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设置状态栏样式。然后我们调用给该方法的原始完成块,如果有的话。


7
2017-07-23 11:19



经过测试和确认,这个解决方法完成了这项工作! - Zillan
在iOS 8中重写 presentViewController:animated:completion 没有工作,所以我改变了 viewWillAppear 和 viewWillDissappear 在样式之间来回切换。 - Luke Vella
状态栏颜色如何指问题? - vahotm


而不是从中分类 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
}];

4
2017-09-02 12:36





在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或storyboard中初始化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]];

2
2018-02-07 02:04



我在第一部分做了你的建议,但它永远不会被调用。我已经将我的根视图控制器子类化处理 shouldAutorotate 哪个效果很好,但是 presentViewController 没有被召唤。还有其他细节吗? - Kevin_TA
它是最顶级视图控制器的根源。 - mofojed


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

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

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

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

如果你想改变iOS 6中按钮的颜色,这就是代码:

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

此代码也适用于iOS 8+以更改UIActivityViewController活动的条形按钮文本颜色(如通过Messages或Mail Composer共享)。


2
2017-11-21 12:12



我正在为iOS 8+开发一个应用程序,并且我的应用程序中需要最后一个(UIBarButtonItem外观setTintColor)的FYI来更改UIActivityViewController活动的条形按钮文本颜色(例如通过Messages或Mail Composer共享)。 - Mason G. Zhwiti
@ MasonG.Zhwiti感谢您的回复。我把它添加到我的答案中。 - Kevin van Mierlo


我找到了一个改变文本颜色的解决方案 发送 和 取消 纽扣。

检查我的答案 这里

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

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

这可能只有在假设的情况下才有效 MFMailComposerViewController 和 MFMessageComposeViewController 是儿童视图控制器 UIActivityViewController因此,如果我们指定状态栏样式 UIActivityViewController 那么子视图控制器应该具有与父视图相同的状态栏样式。

有一种方法 UIViewController 叫 childViewControllerForStatusBarStyle这里 是Apple的文档。

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


0
2018-04-12 20:48





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

self.window.tintColor = [UIColor redColor];

要么

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

酒吧按钮

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

-1
2017-11-26 04:52