web-dev-qa-db-fra.com

iOS 10 ne peut plus définir de couleur et de barre de couleur sur MFMessageComposeViewController

Le code ci-dessous fonctionne sur iOS version 9.x ou inférieure. Pour une raison quelconque, cela ne fonctionne pas si iOS 10

 if([MFMessageComposeViewController canSendText])
             {
                 controller.body = message;
                 NSString *tel = pContact.tlc;
                 controller.recipients = pContact.tlc?@[tel]:nil;
                 controller.messageComposeDelegate = self;
                 controller.navigationBar.tintColor = [UIColor whiteColor];
                 controller.navigationBar.barTintColor = [UIColor blueColor];
                 [self presentViewController:controller animated:YES completion:nil];
             }

est-ce cassé ou quelque chose a-t-il changé? Pas sûr de ce qui manque ici. Je suis dans le noir (noir)

EDIT: J'ai essayé d'utiliser du code de test sur un nouveau projet à vue unique vide et j'obtiens les mêmes problèmes. 

@IBAction func SMS(_ sender: AnyObject) {
        let composeVC = MFMessageComposeViewController()
        composeVC.messageComposeDelegate = self

        // Configure the fields of the interface.
        composeVC.recipients = ["5555555555"]
        composeVC.body = "Hello from California!"
        composeVC.navigationBar.tintColor = UIColor.green
        composeVC.navigationBar.barTintColor = UIColor.purple
        // Present the view controller modally.
        self.present(composeVC, animated: true, completion: nil)
    } 

Edit: L'apparence de UINavigationBar peut définir la couleur d'une application de test pour l'arrière-plan ou barTint, mais je ne parviens toujours pas à définir la couleur du texte pour l'application de test. L'application sur laquelle je travaille utilise déjà l'apparence de UINavigationBar pour définir la couleur de la barre de navigation dans l'application, mais cela n'affecte pas la barre de navigation pour le SMS car elle apparaît sur fond blanc et texte blanc. pas capable de changer la couleur du texte ou la couleur de fond rendre cette vue inutilisable. 

21
Pascale Beaulac

Problème

  • Pour certaines raisons dans iOS10.x barTintColor ne fonctionne pas sur certains des conteneurs de partage. 
  • Mais il existe une solution de contournement pour corriger la couleur de la barre de navigation sur tous les conteneurs de partage.

Solution

  • Utilisez UINavigationBar.appearance() pour changer la couleur de la barre de navigation.
  • Utilisez la méthode backgroundColor property & setBackgroundImage(_:for:) pour corriger la couleur de la barre de navigation.

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)
    }
}

J'espère que ça aide!.

11
Tesan3089

Avant iOS 10, j'utilisais le proxy d'apparence pour UINavigationBar, à peu près comme ceci:

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];

Ceci couvrait mon utilisation de MFMessageComposeViewController, avec setTitleTextAttributes en prenant soin de la couleur du texte du titre/légende.

Avec iOS 10, j'utilise les solutions suivantes. Juste avant de présenter la MFMessageComposeViewController, je change les attributs de texte du titre. Par exemple.:

- (void)sendTap:(id)s
{
    // some code...

    NSDictionary* newTitleAttribs = @{ NSForegroundColorAttributeName: [ColoursAndStyles sharedInstance].fontColourTitleStrip,
                                       NSFontAttributeName: [ColoursAndStyles sharedInstance].fontNavbarBoldTitle };

    [[UINavigationBar appearance] setTitleTextAttributes:newTitleAttribs];

    // present the MFMessageComposeViewController...
}

Et puis redéfinissez les paramètres sur la façon dont je les souhaite pour le reste de l'application, lorsque la MFMessageComposeViewController se termine, par exemple:

- (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...
    }];
}
2
Gavin Hope

Cela fonctionne au moins pour moi pour les titres et les boutons.

[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil].tintColor = [UIColor redColor];
[UINavigationBar appearance].titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor redColor]};

Cherchez plus d’informations ici: https://developer.Apple.com/reference/uikit/uiappearance

J'espère que cela t'aides. À votre santé

1
tico

Solution Objective-C:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor redColor]] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setTranslucent:NO];
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];
[[UINavigationBar appearance] setTintColor:[UIColor redColor]];

Image avec méthode de couleur:

+ (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
Alex_Burla