当从iOS7中的UIActivityViewController呈现时,无法在邮件编辑器中设置“发送”和“取消”button的文本颜色

我正在使用UIActivityViewController共享iOS7中的项目。 当我点击邮件选项时,popup邮件编辑器,但是导航栏上的取消和发送button和导航栏本身是蓝色的,使得阅读非常困难,所以我想改变它们的颜色。 它在iOS6中工作,但不在iOS7中。

我试过了

[[UIBarButtonItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor], UITextAttributeTextColor, [UIColor clearColor], UITextAttributeTextShadowColor, nil] forState:UIControlStateNormal]; 

在iOS6中工作,我试过了

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

这会在第一次运行应用程序之前使颜色闪烁红色,然后立即切换回蓝色。

当从UIActivityViewController提供时,pipe理更改发送取消button的文本颜色,这些button位于MFMailComposerViewController (包括发送取消 )和MFMessageComposeViewController (仅取消 )中的UINavigationBar上。

使用UIActivityViewController,点击MessageMail

使用UIActivityViewController

您会注意到发送取消button的默认文本颜色是蓝色的:

默认的蓝色

为了改变这种情况,在AppDelegate.m类的didFinishLaunchingWithOptions方法中,插入以下行:

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

这导致:

改成白色

您也可以使用其他颜色,例如:

[UIColor purpleColor];

改成紫色

[UIColor greenColor];

改成绿色

我怎么testing这个? 我注意到这个解决scheme适用于以下内容:

  • 使用Xcode 5.1,在iOS 7.1模拟器中,构build为基本iOS SDK 7.1(可以从select项目文件 – > Build Settings – > Base SDK中进行select,也可以从General – > Deployment Target – > 7.1中select)
  • 使用Xcode 5.1,在iPhone 4上,构build为基本的iOS SDK 7.0(可以从select项目文件 – > Build Settings – > Base SDK中进行select,也可以从General – > Deployment Target – > 7.0中进行select)
  • 使用Xcode 5.1,在iPhone 4上,构build为基本的iOS SDK 7.1(可以从select项目文件 – > Build Settings – > Base SDK中进行select,也可以从General – > Deployment Target – > 7.1中select)

在以下情况下进行testing时不起作用:

  • 使用Xcode 5.1,在iOS 7.0模拟器中,构build为基本的iOS SDK 7.0(可以从select项目文件 – > Build Settings – > Base SDK中进行select,也可以从General – > Deployment Target – > 7.0中select)

因此,使用它应该是安全的,因为我相信实际设备上的行为比iOS模拟器中的行为更重要。 如果有人知道为什么它不能在iOS 7.0模拟器中工作,我想知道。 🙂

在UIActivityViewController中添加色调和状态栏颜色。 Swift 3解决scheme:

 extension MFMailComposeViewController { override open func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent } open override func viewDidLoad() { super.viewDidLoad() navigationBar.isTranslucent = false navigationBar.isOpaque = false navigationBar.barTintColor = UIColor.white navigationBar.tintColor = UIColor.white } } 

到目前为止,这是iOS 7.1的function。

创buildUIActivityViewController子类并覆盖以下方法:

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

这将使button变白,状态栏变白。

对于Swift:

 self.navigationController?.presentViewController(activityViewController, animated: true, completion: { () in UIBarButtonItem.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().barTintColor = UIColor.whiteColor() // optional to change bar backgroundColor } 

这将改变发送取消button的颜色为白色(在iOS 7,8testing),但我仍然无法使状态栏文本颜色白色(虽然我还没有尝试过UIActivityViewController子类的解决scheme来更改状态栏文本颜色)

这似乎是iOS 7的一个错误。我已经看到这个在线的其他报告。 它也不会在iOS 7.1中修复。

具体来说,不pipe你做什么,你都不能在UIActivityViewController显示的对话框的导航栏上设置色调。

我有我的应用程序相同的问题,其中UINavigationBartintColor属性是白色到处感谢外观代理。 由此产生的效果是,邮件编辑器视图控制器navigationBar中的UIBarButtonItem不可见(白色导航栏上的白色button)。

我在我的application:didFinishLaunchingWithOptions:有这个调用application:didFinishLaunchingWithOptions:方法:

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

因为现在不可能访问UIActivityViewController中的邮件编辑器视图控制器的UINavigationBar ,所以我做了以下解决方法,这是从Alex的答案中得到的启发:

 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 temporary [[UINavigationBar appearance] setTintColor:[UIColor colorWithRed:232.0f/255.0f green:51.0f/255.0f blue:72.0f/255.0f alpha:1.0f]]; }]; 

PS:此代码适用于iOS 7,但可以在iOS 6中使用[[UIBarButtonItem appearance] setTintColor:][[UIBarButtonItem appearance] setTintColor:] Kevin van Mierlo的回答)

试试这个代码可能会帮助你

 [[mailComposer navigationBar] setTintColor:[UIColor blackColor]]; 

如果你想在iOS 7中设置取消和发送button的颜色,你应该使用这个:

 // Change the colours of the buttons in iOS 7 [[UINavigationBar appearance] setTintColor:[UIColor redColor]]; 

在iOS 6中的确是这些,你也应该把它留在你的代码中:

 // Change the colours of the buttons in iOS 6 [[UIBarButtonItem appearance] setTintColor:[UIColor redColor]]; // Change the color of the the navigation bar in iOS 6 and 7 [[UINavigationBar appearance] setBarTintColor:[UIColor redColor]]; 

我无法得到亚历克斯的解决scheme的工作,但是我设法得到Paillou的工作答案的变化,虽然我必须在我的情况下设置barTintColor和titleTextAttributes:

 UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities]; activityViewController.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAddToReadingList, UIActivityTypePostToVimeo, UIActivityTypePostToFlickr, UIActivityTypeAirDrop]; [activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) { // back to normal color [[UINavigationBar appearance] setBarTintColor:AAColorInputBorder]; [[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"Avenir-Medium" size:18], NSFontAttributeName, [UIColor whiteColor], NSForegroundColorAttributeName, nil]]; }]; [self presentViewController:activityViewController animated:YES completion:^{ // change color temporary [[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]]; [[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"Avenir-Medium" size:18], NSFontAttributeName, AAColorInputBorder, NSForegroundColorAttributeName, nil]]; 

感谢Paillou!

这对我有效:在AppDelegate.m中的函数中:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

我input了以下代码:

 //mail composer [[UINavigationBar appearanceWhenContainedIn:[MFMailComposeViewController class], nil] setBarTintColor:myBackgroundColor]; [[UINavigationBar appearanceWhenContainedIn:[MFMailComposeViewController class], nil] setTintColor:myBarItemsColor]; 

它在iOS7 + iOS8上工作得很好,没有尝试更新的版本

那么为什么我们不能改变苹果代码中UI的方式是有道理的。 主要是因为它是苹果的。 它们不允许您以任何方式编辑MFMailComposerViewController中UI的方式。 如果有办法的话,我也不知道,但是我从来没有办法做到。 MFMailComposeViewController不支持外观属性,因为它是在iOS 3.0中创build的,外观没有成为一个东西,直到iOS 5.0

这是一个链接到MFMailComposeViewController苹果文档: MFMailComposeViewController

希望这可以帮助!

对于ios7我认为你应该通过这个代码

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

如果它也不能正常工作,请尝试使用Internet上提供的邮件撰写视图控制器苹果文档。

在呈现邮件编辑器之前插入这样的行:

 [mailComposer.navigationBar setTintColor:[UIColor whiteColor]]; [self presentViewController:mailComposer animated:YES completion:nil]; 

即使我在应用程序中设置状态栏样式完成启动,我还需要在完成块中重新设置它,如下所示:

 [self presentViewController:mailComposer animated:YES completion:^{[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];}]; 

我有这个巨大的麻烦,尤其是当MFMailComposeViewController / MFMessageViewController本身显示UIActivityViewController

我采取了使用viewDidAppear / viewDidDisappear方法swizzling方法撤消,然后重做我的应用程序的颜色和字体的自定义,从https://github.com/rentzsch/jrswizzle一些帮助:;

SwizzledComposeViewControllers.h

 #import <MessageUI/MessageUI.h> @interface MFMailComposeViewController (GMSwizzling) @end @interface MFMessageComposeViewController (GMSwizzling) @end 

SwizzledComposeViewControllers.m

 #import "SwizzledComposeViewControllers.h" #import "AppDelegate.h" #import "JRSwizzle.h" @implementation MFMailComposeViewController (GMSwizzling) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self jr_swizzleMethod:@selector(init) withMethod:@selector(gmswizzled_init) error:nil]; [self jr_swizzleMethod:@selector(viewWillAppear:) withMethod:@selector(gmswizzled_viewWillAppear:) error:nil]; [self jr_swizzleMethod:@selector(viewWillDisappear:) withMethod:@selector(gmswizzled_viewWillDisappear:) error:nil]; }); } - (instancetype)gmswizzled_init { [(AppDelegate*)UIApplication.sharedApplication.delegate uncustomiseAppearance]; return [self gmswizzled_init]; } - (void)gmswizzled_viewWillAppear:(BOOL)animated { [(AppDelegate*)UIApplication.sharedApplication.delegate uncustomiseAppearance]; [self gmswizzled_viewWillAppear:animated]; } - (void)gmswizzled_viewWillDisappear:(BOOL)animated { [(AppDelegate*)UIApplication.sharedApplication.delegate customiseAppearance]; [self gmswizzled_viewWillDisappear:animated]; } @end @implementation MFMessageComposeViewController (GMSwizzling) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self jr_swizzleMethod:@selector(init) withMethod:@selector(gmswizzled_init) error:nil]; [self jr_swizzleMethod:@selector(viewWillAppear:) withMethod:@selector(gmswizzled_viewWillAppear:) error:nil]; [self jr_swizzleMethod:@selector(viewWillDisappear:) withMethod:@selector(gmswizzled_viewWillDisappear:) error:nil]; }); } - (instancetype)gmswizzled_init { [(AppDelegate*)UIApplication.sharedApplication.delegate uncustomiseAppearance]; return [self gmswizzled_init]; } - (void)gmswizzled_viewWillAppear:(BOOL)animated { [(AppDelegate*)UIApplication.sharedApplication.delegate uncustomiseAppearance]; [self gmswizzled_viewWillAppear:animated]; } - (void)gmswizzled_viewWillDisappear:(BOOL)animated { [(AppDelegate*)UIApplication.sharedApplication.delegate customiseAppearance]; [self gmswizzled_viewWillDisappear:animated]; } @end 

(我不得不承认,我不记得为什么我在initviewWillAppear ,不自定的外观,但我相当肯定有一个原因…)。

在Swift中,我为UIViewController做了一个扩展:

 extension UIViewController { func presentActivityViewController(viewControllerToPresent: UIViewController) { self.presentViewController(viewControllerToPresent, animated: true) { _ in UIBarButtonItem.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().barTintColor = Config.primaryColor } } } 

当我需要提出一个UIActivityViewController我打电话:

  let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: []) presentActivityViewController(activityViewController) 

Swift中 ,在iOS9上进行设置

 UINavigationBar.appearance().barTintColor = UIColor.greenColor() // eg UINavigationBar.appearance().translucent = false 

在呈现活动视图控制器之前为我做了诡计。

我在iOS 9和10中尝试了许多不同的方法,但是这是唯一可行的方法。 请注意,我也有一个背后的导航栏的背景图像:

 [UIApplication.sharedApplication setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; NSDictionary *attribs = @{NSForegroundColorAttributeName:UIColor.whiteColor}; UINavigationBar.appearance.titleTextAttributes = attribs; UINavigationBar.appearance.tintColor = UIColor.whiteColor; [UINavigationBar.appearance setBackgroundImage:[UIImage imageNamed:@"IOSNavigationBar"] forBarMetrics:UIBarMetricsDefault]; UIBarButtonItem.appearance.tintColor = UIColor.whiteColor; 

我通过inheritanceUIActivityViewController来解决我的问题。 viewWillAppear viewWilldisapper

 extension UIActivityViewController { override open func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) UINavigationBar.appearance().barTintColor = .white } open override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.isTranslucent = false navigationController?.navigationBar.isOpaque = false navigationController?.navigationBar.barTintColor = UIColor(red: (247/255), green: (247/255), blue: (247/255), alpha: 1) //navigationBar.tintColor = UIColor.white } open override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(true) UINavigationBar.appearance().barTintColor = mycustomColor } }