ios7 - poner - Cambie el color del botón de navegación en MFMailComposerViewController en iOS 7
como poner el boton de inicio en iphone (6)
Como dice OemerA, no hay manera de cambiar los colores. Mi problema fue que en Apariencia UIA establecí el color de fondo de la barra en azul, por lo que los "botones" ya no son visibles. Ya que el correo electrónico no es realmente parte de su aplicación, tiene más sentido restablecer la apariencia de la barra de queja antes de crear el editor de correo. Así es como lo hago:
// set to normal white
[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor], NSForegroundColorAttributeName, nil]];
MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];
// set to back to blue with white text
[[UINavigationBar appearance] setBarTintColor:[UIColor blueColor]];
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], NSForegroundColorAttributeName, nil]];
Estoy tratando de cambiar el color del texto para los botones de navegación en un MFMailComposerViewController pero no funciona como en iOS 6. En iOS 6 funcionó con UIAppearance de esta manera:
// Navigation button
UIBarButtonItem *barButton = [UIBarButtonItem appearance];
NSDictionary *barButtonTitleTextAttributes = @{UITextAttributeTextColor: [UIColor redColor]};
NSDictionary *disabledBarButtonTitleTextAttributes = @{UITextAttributeTextColor: [UIColor grayColor]};
[barButton setTitleTextAttributes:barButtonTitleTextAttributes forState:UIControlStateNormal];
[barButton setTitleTextAttributes:disabledBarButtonTitleTextAttributes forState:UIControlStateDisabled];
[barButton setBackgroundImage:[[UIImage imageNamed:@"btn_appearance"] stretchableImageWithLeftCapWidth:6 topCapHeight:0] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
Pero esto no funciona en iOS 7 y se ve siempre así:
También intenté establecer el atributo tintColor
la tintColor
de navegación, pero esto tampoco tiene ningún efecto:
navigationBar.tintColor = [UIColor redColor];
¿Hay alguna forma de cambiar el color del texto del botón de navegación en un MFMailComposeViewController en iOS 7?
Como se ha señalado varias veces, no funciona la configuración del tinte en la barra de navegación de MFMailComposeViewController. Si tiene otros cambios de apariencia establecidos para toda la aplicación, el color del tinte es solo un aspecto del problema, en nuestra aplicación hemos cambiado el color de la barra y el tamaño del texto UIBarButton, por lo que en MFMailComposeViewController vemos esto:
La apariencia en nuestra aplicación se establece en una clase de StyleGuide con una función configureAppearanceModifiers
llamada desde AppDelegate.
Tomando el ejemplo de @timosdk, he añadido un segundo método:
- (void)neutraliseAppearanceModifiers {
[[UINavigationBar appearance] setTranslucent:NO];
[[UINavigationBar appearance] setTintColor:nil];
[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
[[UINavigationBar appearance] setBackIndicatorImage:nil];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:nil];
[[UINavigationBar appearance] setBackgroundImage:nil
forBarPosition:UIBarPositionAny
barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:nil forState:UIControlStateNormal];
[[UIBarButtonItem appearance] setTitleTextAttributes:nil forState:UIControlStateHighlighted];
[[UIBarButtonItem appearance] setTitleTextAttributes:nil forState:UIControlStateDisabled];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:nil forState:UIControlStateNormal];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:nil forState:UIControlStateHighlighted];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:nil forState:UIControlStateDisabled];
}
Llamo a esto antes de inicializar MFMailComposeViewController y luego llamo a configureAppearanceModifiers
nuevo en el delegado didFinishWithResult
antes de descartar ViewController, esto funciona perfectamente.
Si alguna vez inspecciona la jerarquía de vistas creada mostrando un MFMailComposeViewController, verá que está contenida en una instancia de _UITextEffectsRemoteView. No tiene acceso programático a ninguna subvista de eso, que supongo que es porque probablemente son propiedad de un proceso separado. Esas subvistas heredarán todo lo establecido en los diversos proxies de apariencia UIA (por ejemplo, fondo de barra, títuloAtributos de texto, etc.) pero nada más.
El protocolo UIAppearance no menciona esto en la documentación, pero sí lo tiene en los comentarios del archivo de encabezado:
Note for iOS7: On iOS7 the tintColor property has moved to UIView, and now has special inherited behavior described in UIView.h.
This inherited behavior can conflict with the appearance proxy, and therefore tintColor is now disallowed with the appearance proxy.
El resultado final es que, si bien puede controlar la mayoría de los aspectos de la apariencia de MFMailComposeViewController, siempre obtendrá el color de tinte azul predeterminado del sistema.
Informe de error: http://openradar.appspot.com/radar?id=6166546539872256
Si configura el tintColor en UIWindow , funciona perfectamente bien, la primera vez que presenta el MFMailComposerViewController . Parece que pierde la información tintColor para las llamadas posteriores.
Nota: esto cambia el tinte de cada elemento de su ventana.
Utilicé esto y funciona perfectamente en iOS7 +
MFMailComposeViewController* mailViewController = [[MFMailComposeViewController alloc] init];
mailViewController.mailComposeDelegate = self;
[mailViewController setToRecipients:@[@"[email protected]"]];
[mailViewController.navigationBar setTintColor:[UIColor orangeColor]];
[self presentViewController:mailViewController animated:YES completion:nil];
Swift 3.0
func sendEmail() {
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.navigationBar.tintColor = UIColor.red
mail.mailComposeDelegate = self
mail.setToRecipients(["[email protected]"])
mail.setMessageBody("<p>You''re so awesome!</p>", isHTML: true)
present(mail, animated: true)
} else {
// show failure alert
}
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
}