ios - mfmailcomposeviewcontrollerdelegate - swift 3 send email
MFMailComposeViewController en la barra de estado de iOS 7 son negros (13)
¿Cuál fue el truco para mí?
- Subclase MFMailComposeViewController
Anule los dos métodos como se describe en la respuesta 6
-(UIStatusBarStyle)preferredStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarStyle;
Sobreescriba viewDidLoad de la siguiente manera:
-(void)viewDidLoad {
[super viewDidLoad];
[self preferredStatusBarStyle];
[self setNeedsStatusBarAppearanceUpdate];
}
Tengo un botón de retroalimentación en mi aplicación ios 7 con MFMailComposeViewController. Después de que el usuario haga clic en este botón, se abre la aplicación de correo, pero la barra de estado cambia a negra. ¿Alguien tiene una idea de qué puedo hacer?
tengo este problema solo con ios7. estoy personalizando mi aplicación para iOS7.
MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc] init];
mailController.mailComposeDelegate = self;
[mailController setSubject:@"Feedback"];
// Fill out the email body tex
NSString *emailBody = [NSString stringWithFormat:@"testest"],
[UIDevice currentDevice].model,
[UIDevice currentDevice].systemVersion];
[mailController setMessageBody:emailBody isHTML:NO];
[mailController setToRecipients:[NSArray arrayWithObjects:@"[email protected]",nil]];
dispatch_async(dispatch_get_main_queue(), ^{
[self presentModalViewController:mailController animated:YES];
}
Algunas veces no actualizará correctamente el estilo de la barra de estado. Deberías usar
[self setNeedsStatusBarAppearanceUpdate];
Para decir iOS para actualizar el estilo de la barra de estado, de forma manual. Espero que alguien ahorre algo de tiempo en saberlo.
[self presentViewController:picker animated:YES completion:^{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self setNeedsStatusBarAppearanceUpdate];
}];
En mi caso, estaba usando "ver la apariencia de la barra de estado basada en el controlador" y presentando un controlador de vista modal con una transición de transición personalizada y luego presentando el MFMailComposeViewController desde allí. En esta situación, de forma predeterminada, iOS solo respeta / usa el método preferredStatusBarStyle
del controlador de vista de presentación o "raíz".
Así que una vez que childViewControllerForStatusBarStyle
en mi controlador de vista raíz y preferredStatusBarStyle
en mi controlador de vista modal, todo funcionó como se esperaba ... algo como esto:
// in RootViewController.m ...
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.modalViewController;
}
// in ModalViewController.m ...
- (UIStatusBarStyle)preferredStatusBarStyle {
if (self.mailController != nil)
return UIStatusBarStyleDefault;
return UIStatusBarStyleLightContent;
}
Establezca UIApplication statusBarStyle en el bloque de finalización de presentViewController para su MFMailComposeViewController. es decir
MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
[self.navigationController presentViewController:mailVC animated:YES completion:^{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}];
Es posible que también deba agregar y / o establecer "Ver apariencia de la barra de estado basada en el controlador" en NO en su archivo Info.plist.
Estoy desarrollando una aplicación en iOS8 y he tenido problemas con la barra de estado con todas las funciones nativas como el compositor de correo, la cámara, etc. Lo siguiente resolverá sus problemas:
Pon lo siguiente en tu archivo plist
<key>UIStatusBarHidden</key>
<false/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
Si está utilizando la característica de agregar fila en el guión gráfico, UIViewControllerBasedStatusBarAppearance no es una opción. Además, al agregar una fila, pregunta por BOOLEAN (SÍ / NO). No puede ser una cadena NO en el código fuente. Debe ser un booleano falso. Abra el plist como código fuente en su lugar y agregue las filas anteriores. Elimina tus viejos intentos. Ahora podrá aplicar con éxito los fragmentos de código proporcionados en tantas respuestas incompletas encontradas en la red.
Ahora puede agregar cambios globales en el archivo delegado de la aplicación y / o anularlos en los controladores mismos. Sin lo anterior, todo el código de desbordamiento de pila que he intentado ha fallado al usar una función nativa. Ahora todo está funcionando perfectamente.
Como prueba, reemplace cualquier llamada a cualquier llamada de "finalización" a bordo con
completion:^{[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];}
Intenta agregar categoría a MFMailComposeViewController
EDITAR: esta solución funciona si "Ver apariencia de la barra de estado basada en el controlador" == SÍ
@implementation MFMailComposeViewController (IOS7_StatusBarStyle)
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
-(UIViewController *)childViewControllerForStatusBarStyle
{
return nil;
}
@end
La solución más fácil para mí fue:
extension MFMailComposeViewController {
open override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIApplication.shared.statusBarStyle = .lightContent
}
}
Ninguna de las respuestas anteriores es útil para mí.
Tengo dos problemas
- Barra de estado negra
- capa transparente en la barra de título
Solución
Estado negro : elimino toda la personalización de la barra de navegación
// comentar a continuación la línea en AppDelegate
[[UINavigationBar apariencia] setBackgroundImage: [UIImage imageNamed: @ "nav_bg"] forBarMetrics: UIBarMetricsDefault];
Barra de título transparente : establezca navigationBarHidden = Yes para MFMailComposeViewController
composeViewController.navigationBarHidden = YES;
Parece que la inicialización de MFMailComposeViewController UIApplication.shared.statusBarStyle cambiará a .default ... entonces, guardar el estado antes y volver a configurarlo después de la presentación me solucionó el problema:
// save the state, otherwise it will be changed
let sbs = UIApplication.shared.statusBarStyle
let mailComposerVC = MailComposerVC()
mailComposerVC.navigationBar.barTintColor = UINavigationBar.appearance().barTintColor
mailComposerVC.navigationBar.tintColor = UINavigationBar.appearance().tintColor
mailComposerVC.navigationBar.barStyle = UINavigationBar.appearance().barStyle
if MFMailComposeViewController.canSendMail() {
APP_ROOT_VC?.present(mailComposerVC, animated: true, completion: {
// reapply the saved state
UIApplication.shared.statusBarStyle = sbs
})
}
public class MailComposerVC: MFMailComposeViewController {
public override var preferredStatusBarStyle: UIStatusBarStyle {
return UIApplication.shared.statusBarStyle
}
public override var childViewControllerForStatusBarStyle : UIViewController? {
return nil
}
}
Solución Swift. Establezca la View controller-based status bar appearance
en YES
import UIKit
import MessageUI
import AddressBookUI
extension MFMailComposeViewController {
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
override func childViewControllerForStatusBarStyle() -> UIViewController? {
return nil
}
}
extension ABPeoplePickerNavigationController {
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
override func childViewControllerForStatusBarStyle() -> UIViewController? {
return nil
}
}
Solución para Swift3
Agregue esto a su ViewController:
extension MFMailComposeViewController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
open override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
Establezca la View controller-based status bar appearance
>> YES como se muestra a continuación:
Gracias a @SoftDesigner
Otra solución más limpia que puede no cambiar otras configuraciones en su aplicación. Al presentar Mail VC, cambie la barra de estado en el bloque de finalización:
controller.present(mailComposeViewController, animated: true) {
UIApplication.shared.statusBarStyle = .lightContent
}
iOS 7 introduce un método que prefersStatusBarHidden
, pero no será tan fácil de usar en este caso. Puede preferir utilizar la propiedad UIApplication
de UIApplication
mientras se presenta el modal.
[self presentViewController:mailViewController animated:YES completion:^(void) { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; }];