Удалите прозрачный эффект в UINavigationBar MFMailComposeViewController

Я не нашел способ удалить прозрачный эффект (iOS 7) в UINavigationBar MFMailComposeViewController. Нет проблем для всех других UINavigationBars в моем приложении.

Я пробовал это без успеха:

MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc] init];
mailController.navigationBar.translucent = NO;

Любая идея?

Ответ 1

Немного поздно, но для тех, кто сталкивается с этим сообщением:

По умолчанию MFMailComposeViewController navigationBar будет полупрозрачным, и вы не можете его изменить. Единственными свойствами, которые вы можете изменить, являются те, которые поддерживаются прокси-сервером. Из документации Apple:

Иерархия представления этого класса является частной и вы не должны изменять Это. Однако вы можете настроить внешний вид экземпляра, используя протокол UIAppearance.

Это дает вам ограниченные возможности для изменения внешнего вида панели навигации MFMailComposeViewController, так как не все свойства поддерживаются (например, если вы попробуете что-то вроде [UINavigationBar appearance] setTranslucent: NO], оно будет разбиваться, потому что это свойство не поддерживается по прокси.

Здесь список свойств, поддерживаемых прокси-сервером Appearance: https://gist.github.com/mattt/5135521

Теперь, чтобы настроить MFMailComposeViewController navigationBar непрозрачным, вам необходимо изменить его backgroundColor (это свойство UIView разрешено, UINavigationBar является подклассом UIView):

[[UINavigationBar appearance] setBackgroundColor:[UIColor whiteColor]];

Убедитесь, что вы сделали это, прежде чем создавать экземпляр своего MFMailComposeViewController, например:

[[UINavigationBar appearance] setBackgroundColor:[UIColor whiteColor]];
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];

Вы также можете использовать внешний видWonContainedIn: MFMailComposeViewController, чтобы повлиять на navBar только тогда, когда он принадлежит MFMailComposeViewController, или вы можете поменять его обратно до того, что было до этого в mailComposeController: didFinishWithResult.

Ответ 3

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

если вы не хотите, чтобы он изменялся глобально:

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

@implementation MFMailComposeViewController (IOS7_StatusBarStyle)

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

-(UIViewController *)childViewControllerForStatusBarStyle
{
   return nil;
}

@end

Ответ 4

Это не то, что может вписаться в несколько строк кода, но это один из подходов, который может сработать для вас.

Чтобы скрыть панель навигации:

[[self navigationController] setNavigationBarHidden: YES animated: YES];

Чтобы показать это:

[[self navigationController] setNavigationBarHidden: NO animated: YES];

Документация для этого метода доступна здесь.

Для прослушивания "двойного щелчка" или двойного касания, подкласса UIView и создания экземпляра этого подкласса вашего вида представления вида просмотра.

В подклассе вида переопределите его -touchesEnded: withEvent: method и подсчитайте количество касаний, которые вы получаете за время, путем измерения времени между двумя последовательными кранами, возможно, с -timeIntervalSinceDate:. Или проверьте результат с помощью [touch tapCount].

Если вы получаете два крана, ваше подклассовое представление вызывает NSNotification, зарегистрированный вашим контроллером просмотра для прослушивания.

Когда ваш контроллер просмотра слышит уведомление, он запускает селектор, который либо скрывает, либо показывает навигационную панель, используя вышеупомянутый код, в зависимости от текущего состояния видимости навигационной панели, доступ к которому осуществляется через чтение навигационной панели isHidden.