2013-03-22 30 views
17

UINavigationBar nesnelerinin arka plan resmini, uygulamam boyunca ayarlamak için UIAppearance protokolünü kullanıyorum.MFMailComposeViewController için UIAppearance özelliğini geçersiz kıl Önizleme

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

Ben varsayılan stil gezinti çubuğu görüntülenecek şekilde MFMailComposeViewController örnekleri için geçersiz kılmak istiyorum. Bunu ayarlamak için appearanceWhenContainedIn kullanmayı denedi ve bir hata yapmadan veya bunu gerçekleştirmek için daha iyi bir yol yoktur miyim bu değil

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

iOS 6. iOS 5 ama çalışır?

+0

Elma Geliştirici Destek göre: Bu iOS 7.0 bilinen bir hatadır. – jasonjwwilliams

+1

bu iOS 9 – Climbatize

cevap

23

Normal önlemlerle bir MFMailComposer görünümünü değiştirme mümkün değildir, ancak ben defalarca kullandım yapabileceğiniz küçük bir geçici çözüm vardır önce. Senin gösterin yönteminde Şimdi

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

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

özel besteci arayüzü yapmak istediğiniz değişikliklere uygulanır:

size yeni bir görünüm uygulamak isteyen hangi sınıfa iki yöntemi ekleyin.

- (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]; 
    } 
} 

Temsilcinizde, arabirimi olduğu gibi değiştirin.

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

Bu benim kendi uygulamalarımda da var. Uygulama temsilciliğimde, standart bir önceden denetlenmiş görünüm denetleyicisi (posta denetleyicisi, iPod kitaplığı seçici, vb.) Sunmam gerektiğinde, tüm kullanıcı arabirimi özelleştirmeleri açmak ve kapatmak için herhangi bir yeri arayabileceğim bir setAppearance ve unsetAppearance yöntemim var. – Ziconic

+2

@Ziconic, uiappearance özelliklerini anında nasıl "unset" ettiğini söyler misiniz? teşekkür ederim – Pavan

2

Mail Composer görünümü, iOS 6 altında farklı bir işlemde çalıştırılır ve doğrudan değiştirilemez (görünüm esasen başka bir uygulamanın içinde olduğu için). Ne göstereceğini özelleştiremezsiniz, bu Twitter & Facebook görünümleri için aynıdır. İşte

uzaktan görünümü denetleyicileri daha ayrıntılı bir açıklama: http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/

+3

'da giderilmiştir. Uzak bir işlemde çalıştırılsa bile, bu geliştiriciye açık olmayan bir uygulama ayrıntısıdır; geliştirici söz konusu olduğu sürece, daha önce olduğu gibi görünüyor. Çalışmıyorsa bir hata atmayı öneririm; Uzaktan görüntüleme denetleyici mekanizmasının en azından * UIA yeniden görünme mekanizmasıyla * bir şeyler yaptığını biliyorum, çünkü orada çökme günlükleri var. :) –

+0

Ana görünüm gerçekten farklı bir işlemdir, ancak navigasyon çubuğu ve içinde bulunduğu gezinme denetleyicisi, uygulamanızla aynı işlemdedir ve UIAppearance özelleştirmelerinize göre biçimlendirilir. – Ziconic

+0

@BJHomer Bir radar verdim. Dupe etmek için çekinmeyin. rdar: // 13490724 – markdorison

1

Basitçe MFMailComposeViewController örneğinde tintColor ayarlayın:

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