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