在应用程序中使用自定义UINavigationBar主题为MFMailComposer显示白色UINavigationBar

时间:2014-11-04 09:25:26

标签: ios objective-c uinavigationbar mfmailcomposeviewcontroller

我有一个简单的应用程序UITableViewController。该应用使用自定义主题,将主题应用于背景和UINavigationBar。从这个视图中,我有一个UINavigationBarItem(在代码中创建),用MFMailComposerViewController打开电子表格。

我发现自定义主题UINavigationBar有一些奇怪的行为,所以我只想删除图像并使用带有黑色按钮的白色UINavigationBar(取消,发送,标题)。

我有以下代码:

if ([MFMailComposeViewController canSendMail])
{
    MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
    mailer.mailComposeDelegate = self;
    [mailer setSubject:@"PDF"];
    [mailer addAttachmentData:data mimeType:@"application/pdf" fileName:fileName];
    NSString *emailBody = @"Please find attached PDF";
    [mailer setMessageBody:emailBody isHTML:NO];

    [self presentViewController:mailer animated:YES completion:^{
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
        mailer.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]};
        [[UINavigationBar appearance] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
        [[UINavigationBar appearance] setBarTintColor:[UIColor blackColor]];
        [[mailer navigationBar] setTintColor:[UIColor blackColor]];

    }];
}

所以我实际上删除了那里的图像。问题是它可以工作,但它实际上并没有使按钮变黑。此外,在某些情况下,会出现自定义主题UINavigationBar图像显示的位置。我希望这永远不会发生。

我甚至创建了一个新类,它是MFMailComposer的子类,并将UINavigationBar的“主题”设置为白色创建栏,但仍然带来了图像有时。

我想要的是确保UINavigationBar永远不会显示图像,并且始终有取消,标题和发送的黑色按钮。

任何想法都会非常感激。

更新

删除上面的setBarTintColorsetTintColor代码,我注意到第一次调用MFMailComposeViewController时,主题就在UINavigationBar中,但是如果我关闭该视图,然后重新打开它,然后删除图像,UINavigationBar为白色。如何在没有主题的情况下将其显示为白色?我还删除了将图像移除到完成块之外的代码,但这没有什么区别。

1 个答案:

答案 0 :(得分:2)

要使用颜色填充UINavigationBar,您可以将 backgroundImage 属性与空白阴影图像一起使用:

[[UINavigationBar appearance] setBackgroundImage:[self imageWithColor:[UIColor whiteColor]] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

-imageWithColor 是使用所选颜色创建UIImage的另一种方法:

- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return image; 
}

然后设置黑色文本颜色和黑色状态栏,以便它可见:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
[[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blackColor]}];

并且不要忘记这些属性将应用于每个导航栏。 希望能帮助到你! :)