MFMailComposeViewController в строке состояния iOS 7 - черный

У меня есть кнопка обратной связи в моем приложении ios 7 с MFMailComposeViewController. После того, как пользователь нажмет эту кнопку, откроется mailcomposer, но панель состояния изменится на черный. У кого-нибудь есть идея, что я могу сделать?

У меня эта проблема только с ios7. Я настраиваю свое приложение для 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];
}

Ответ 1

Задайте статусBARStyle UIApplication в блоке завершения текущегоViewController для вашего MFMailComposeViewController. то есть.

    MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
    [self.navigationController presentViewController:mailVC animated:YES completion:^{
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    }];

Вам также может потребоваться добавить и/или установить "Просмотр строки состояния на основе контроллера" в НЕТ в файле Info.plist.

Ответ 2

Попробуйте добавить категорию в MFMailComposeViewController

EDIT: это решение работает, если "Просмотреть статус панели управления на основе контроллера" == YES

@implementation MFMailComposeViewController (IOS7_StatusBarStyle)

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

-(UIViewController *)childViewControllerForStatusBarStyle
{
   return nil;
}

@end

Ответ 3

Быстрое решение. Установите View controller-based status bar appearance в 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
    }
}

Ответ 4

Какая была трюка для меня:

  • Подкласс MFMailComposeViewController
  • Переопределите два метода, как описано в ответе 6

    -(UIStatusBarStyle)preferredStatusBarStyle;

    -(UIViewController *)childViewControllerForStatusBarStyle;

  • Переопределить viewDidLoad следующим образом:

    -(void)viewDidLoad {
    [super viewDidLoad];
    [self preferredStatusBarStyle];
    [self setNeedsStatusBarAppearanceUpdate];
    }

Ответ 5

Несколько раз он не обновляет стиль строки состояния должным образом. Вы должны использовать

 [self setNeedsStatusBarAppearanceUpdate];

Чтобы сказать, что iOS обновляет стиль строки состояния вручную. Надеюсь, что кто-то сэкономит время, зная это.

[self presentViewController:picker animated:YES completion:^{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
     [self setNeedsStatusBarAppearanceUpdate];
}];

Ответ 6

Ни один из вышеперечисленных ответов не работает для меня.

У меня есть две проблемы.

  • Черная строка состояния
  • прозрачный слой в строке заголовка

enter image description here

Решение

  • Состояние черного. Я удаляю настройку панели навигации.

    //комментарий ниже строки в AppDelegate

    [[Внешний вид UINavigationBar] setBackgroundImage: [UIImage imageNamed: @ "nav_bg" ] forBarMetrics: UIBarMetricsDefault];

  • Прозрачная строка заголовка - установить navigationBarHidden = Да для MFMailComposeViewController

    composeViewController.navigationBarHidden = YES;

Ответ 7

Кажется, что инициализация MFMailComposeViewController UIApplication.shared.statusBarStyle изменится на .default... поэтому, сохраняя состояние до и установив его снова после презентации, я решил проблему для меня:

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

Ответ 8

Решение для Swift3

Добавьте это в свой ViewController:

extension MFMailComposeViewController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}

Установите View controller-based status bar appearance → YES, как показано ниже:

введите описание изображения здесь

Благодаря @SoftDesigner

Другое решение > , которое не может изменять другие настройки в вашем приложении. Представляя Mail VC, измените строку состояния в блоке завершения:

controller.present(mailComposeViewController, animated: true) {
            UIApplication.shared.statusBarStyle = .lightContent
        }

Ответ 9

iOS 7 вводит метод prefersStatusBarHidden, но в этом случае его будет не так просто. Вы можете предпочесть использовать свойство statusBarHidden UIApplication, пока представлен модальный формат.

Ответ 10

[self presentViewController:mailViewController animated:YES completion:^(void) { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; }];

Ответ 11

В моем случае я использовал "отображение строки состояния на основе контроллера на основе контроллера" и представлял контроллер модального представления с пользовательским переходом segue, а затем представлял MFMailComposeViewController. В этой ситуации по умолчанию iOS уважает/использует только представляющий или "корневой" контроллер вида preferredStatusBarStyle.

Итак, как только я перепробовал childViewControllerForStatusBarStyle в моем контроллере корневого представления и preferredStatusBarStyle в моем модульном контроллере просмотра, все работало как ожидалось... что-то вроде этого:

// in RootViewController.m ...
- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.modalViewController;
}

// in ModalViewController.m ...
- (UIStatusBarStyle)preferredStatusBarStyle {
    if (self.mailController != nil)
        return UIStatusBarStyleDefault;
    return UIStatusBarStyleLightContent;
}

Ответ 12

Я создаю приложение в iOS8 и имел проблемы со строкой состояния со всеми родными функциями, такими как почтовый композитор, камера и т.д. Ниже будут решены ваши проблемы:

Поместите в файл plist следующее:

  <key>UIStatusBarHidden</key>
  <false/>
  <key>UIViewControllerBasedStatusBarAppearance</key>
  <false/>

Если вы используете функцию добавления строки в раскадровке, UIViewControllerBasedStatusBarAppearance не является вариантом. Также при добавлении строки он запрашивает BOOLEAN (YES/NO). Он не может быть ни строкой в ​​исходном коде, он должен быть ложным логическим. Вместо этого откройте plist как исходный код и добавьте вышеприведенные строки. Удалите старые попытки. Теперь вы сможете успешно применять фрагменты кода, заданные во множестве неполных ответов, найденных в сети.

Теперь вы можете добавлять глобальные изменения в файл делегата приложения и/или переопределять в самих контроллерах. Без того, чтобы все это было на месте, весь код, который я пробовал, потерпел неудачу при использовании собственной функции. Теперь все работает отлично.

В качестве теста замените любые вызовы на любые "завершенные" вызовы на борту с помощью

    completion:^{[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];}

Ответ 13

Самое легкое решение swift 3 для меня:

extension MFMailComposeViewController {

    open override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        UIApplication.shared.statusBarStyle = .lightContent
    }
}