iOS 10 can no longer set barcolor and tint on MFMessageComposeViewController

后端 未结 4 560
被撕碎了的回忆
被撕碎了的回忆 2021-02-04 01:50

Below code works on iOS version 9.x or less, for some reason this does not work if iOS 10

 if([MFMessageComposeViewController canSendText])
             {
               


        
相关标签:
4条回答
  • 2021-02-04 02:49

    Issue

    • For some reasons in iOS10.x barTintColor is not working on some of the sharing containers.
    • But there's a workaround to fix the Navigation bar colour on all the sharing containers.

    Solution

    • Use UINavigationBar.appearance() to change the navigation bar colour.
    • Use 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!.

    0 讨论(0)
  • 2021-02-04 02:49

    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

    0 讨论(0)
  • 2021-02-04 02:50

    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...
        }];
    }
    
    0 讨论(0)
  • 2021-02-04 02:51

    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;
    }
    
    0 讨论(0)
提交回复
热议问题