Подтвердить что ты не робот

Заменить свойство UIAppearance для MFMailComposeViewController

Я использую протокол UIAppearance для установки фонового изображения объектов UINavigationBar во всем приложении.

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"image-name"] forBarMetrics:UIBarMetricsDefault];

Я хотел бы переопределить это для экземпляров MFMailComposeViewController, чтобы отображалась панель навигации по умолчанию. Я попытался использовать появлениеWhenContainedIn, чтобы установить это, и это работает на iOS 5, но не на iOS 6.

[[UINavigationBar appearanceWhenContainedIn:[MFMailComposeViewController class], nil] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

Я делаю ошибку или есть лучший способ сделать это?

4b9b3361

Ответ 1

Изменение внешнего вида MFMailComposer с помощью обычных мер невозможно, но вы можете сделать небольшое обходное решение, которое я использовал много раз раньше.

Добавьте два метода в класс, в который вы хотите реализовать новый вид:

- (void)applyComposerInterfaceApperance
{
    [[UINavigationBar appearance] setTintColor:[UIColor blueColor]];
}

- (void)applyGlobalInterfaceAppearance
{
    // My default color of choice
    [[UINavigationBar appearance] setTintColor:[UIColor redColor]];
}

Теперь в вашем методе show примените специальные изменения интерфейса композитора, которые вы хотите сделать.

- (void)showMailComposer
{
    if ([MFMailComposeViewController canSendMail]) 
    {
        [self applyComposerInterfaceApperance];

        MFMailComposeViewController *viewController = [[MFMailComposeViewController alloc] init];
        viewController.mailComposeDelegate = delegate;
        [viewController setToRecipients:mailRecepients];
        [viewController setSubject:mailSubject];
        [viewController setMessageBody:messageBody isHTML:NO];
        [self presentModalViewController:viewController animated:YES];
    }
}

И в вашем делегате измените интерфейс так, как это было.

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    // Do normal mail composer did finish stuff in here
    [self applyGlobalInterfaceAppearance];
}

Ответ 2

Представление Mail Composer запускается в другом процессе под iOS 6 и не может быть подделано напрямую (поскольку представление по существу находится внутри другого приложения). Вы не можете настроить то, что он показывает, это то же самое для просмотров Twitter и Facebook.

Ниже приведено подробное описание контроллеров удаленного вида: http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/

Ответ 3

Просто установите tintColor в экземпляре MFMailComposeViewController:

[mailInstance.navigationBar setTintColor:[UIColor someColor]];