2013-03-22 9 views
17

Używam protokołu UIAppearance, aby ustawić obraz tła obiektów UINavigationBar w mojej aplikacji.Zastąp właściwość UIAppearance dla MFMailComposeViewController

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

Chciałbym to zmienić dla wystąpień MFMailComposeViewController tak, że wyświetlany jest domyślny styl pasek nawigacyjny. I próbował użyć appearanceWhenContainedIn ustawić to i to działa na iOS 5, ale nie na iOS 6.

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

jestem popełnienia błędu lub czy istnieje lepszy sposób, aby osiągnąć ten cel?

+0

Według wsparcia technicznego Apple Developer: Jest to znany błąd w iOS 7.0. – jasonjwwilliams

+1

zostało to naprawione w iOS 9 – Climbatize

Odpowiedz

23

Zmiana wyglądu MFMailComposer przez zwykłych środków nie jest możliwe, ale nie jest trochę obejście można zrobić, których używałem wiele razy przed.

Dodaj dwie metody do klasy, w której chcesz realizować nowy wygląd:

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

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

teraz w Twoich metody wykazują, stosuje się specjalny interfejs kompozytor zmienia chcesz zrobić.

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

I w swoim uczestniku zmień interfejs z powrotem na taki, jaki był.

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

To jest to, co robię również w moich własnych aplikacjach. Mam parę metod setAppearance i unsetAppearance w moim appate delegate, że mogę zadzwonić w dowolnym miejscu, aby włączyć i wyłączyć wszystkie moje dostosowania interfejsu użytkownika, ilekroć będę musiał przedstawić standardowy wstępnie zapchany kontroler widoku (kontroler poczty, selektor biblioteki iPod itp.). – Ziconic

+2

@ Ziconic, czy mógłbyś mi powiedzieć, jak "wytrącasz" twoje właściwości uiappearance w locie? Dziękuję Ci – Pavan

2

Widok programu Mail Composer jest uruchamiany w innym procesie w systemie iOS 6 i nie można go modyfikować bezpośrednio (ponieważ widok znajduje się zasadniczo w innej aplikacji). Nie możesz dostosować tego, co pokazuje, jest to takie samo w przypadku widoków na Twitterze na stronie Twitter &.

Oto bardziej szczegółowy opis pilotów Widok: http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/

+3

Mimo że jest uruchamiane w procesie zdalnym, jest to szczegół implementacji nieobsługiwany przez programistę; jeśli chodzi o programistę, wygląda tak samo jak wcześniej. Sugerowałbym zgłoszenie błędu, jeśli nie działa; Wiem, że mechanizm zdalnego kontrolera widoku wykonuje co najmniej * coś * za pomocą mechanizmu UIAppearance, ponieważ mam tam logi awarii. :) –

+0

Widok główny jest rzeczywiście w innym procesie, ale pasek nawigacji i kontroler nawigacyjny, w którym się znajduje, są w tym samym procesie co aplikacja i są stylizowane zgodnie z dostosowaniami UIAppearance. – Ziconic

+0

@BJHomer Złożyłem radar. Nie krępuj się. rdar: // 13490724 – markdorison

1

Wystarczy ustawić tintColor na przykład MFMailComposeViewController:

[mailInstance.navigationBar setTintColor:[UIColor someColor]]; 
Powiązane problemy