Below code works on iOS version 9.x or less, for some reason this does not work if iOS 10
if([MFMessageComposeViewController canSendText])
{
Issue
Solution
UINavigationBar.appearance()
to change the navigation bar colour.backgroundColor
property & setBackgroundImage(_:for:)
method to fix the navigation bar colour.Code
/// Method to set navigation bar color
func setNavigationBar() -> Void
{
// barTintColor will apply color for the app's navigation bar
UINavigationBar.appearance().barTintColor = UIColor.blue
// backgroundColor will apply color for some of the sharing container's app except for Messages app
UINavigationBar.appearance().backgroundColor = UIColor.blue
// backgroundImage will apply the color image for navigation bar for most of the sharing container's except for `Notes`
UINavigationBar.appearance().setBackgroundImage(UIImage(color: UIColor.blue), for:UIBarMetrics.default)
}
/// UIImage extension to create an image from specified color
extension UIImage
{
public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
let rect = CGRect(origin: .zero, size: size)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
color.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
guard let cgImage = image?.cgImage else { return nil }
self.init(cgImage: cgImage)
}
}
Hope it helps!.
This works for me at least for title and button items.
[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil].tintColor = [UIColor redColor];
[UINavigationBar appearance].titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor redColor]};
Look for more info here: https://developer.apple.com/reference/uikit/uiappearance
Hope this helps. Cheers
Prior to iOS 10, I was using the appearance proxy for UINavigationBar
, something like this:
NSDictionary* titleAttribs = @{ NSForegroundColorAttributeName: [ColoursAndStyles sharedInstance].fontColourNavBarTitle,
NSFontAttributeName: [ColoursAndStyles sharedInstance].fontNavbarBoldTitle };
[[UINavigationBar appearance] setBarTintColor:[ColoursAndStyles sharedInstance].viewColourNavBarMain];
[[UINavigationBar appearance] setTintColor:[ColoursAndStyles sharedInstance].viewColourNavBarTint];
[[UINavigationBar appearance] setTitleTextAttributes:titleAttribs];
This covered my use of MFMessageComposeViewController
, with setTitleTextAttributes
taking care of the text colour of the title/caption.
With iOS 10, I'm using the following work around. Just before I present the MFMessageComposeViewController
, I change the title text attributes. E.g.:
- (void)sendTap:(id)s
{
// some code...
NSDictionary* newTitleAttribs = @{ NSForegroundColorAttributeName: [ColoursAndStyles sharedInstance].fontColourTitleStrip,
NSFontAttributeName: [ColoursAndStyles sharedInstance].fontNavbarBoldTitle };
[[UINavigationBar appearance] setTitleTextAttributes:newTitleAttribs];
// present the MFMessageComposeViewController...
}
And then set things back to how I want them for the rest of the app, when the MFMessageComposeViewController
finishes, e.g.:
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
NSDictionary* titleAttribs = @{ NSForegroundColorAttributeName: [ColoursAndStyles sharedInstance].fontColourNavBarTitle,
NSFontAttributeName: [ColoursAndStyles sharedInstance].fontNavbarBoldTitle };
[[UINavigationBar appearance] setTitleTextAttributes:titleAttribs];
// some code...
[controller dismissViewControllerAnimated:YES completion:^{
// some code...
}];
}
Objective-C solution:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor redColor]] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setTranslucent:NO];
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];
[[UINavigationBar appearance] setTintColor:[UIColor redColor]];
Image with color method:
+ (UIImage *)imageWithColor:(UIColor *)paramColor
{
CGRect frame = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContextWithOptions(frame.size, NO, [UIScreen mainScreen].scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetFillColorWithColor(context, [paramColor CGColor]);
CGContextFillRect(context, frame);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}