2013-03-22 7 views
17

Sto utilizzando il protocollo UIAppearance per impostare l'immagine di sfondo degli oggetti UINavigationBar nella mia app.Sovrascrivi la proprietà UIAprevista per MFMailComposeViewController

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

vorrei ignorare questo per le istanze di MFMailComposeViewController in modo da visualizzare la barra di navigazione stile predefinito. Ho cercato di usare appearanceWhenContainedIn per impostare questo e questo funziona su iOS 5, ma non su iOS 6.

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

sto facendo un errore o c'è un modo migliore per ottenere questo risultato?

+0

Secondo Apple Developer Support: Si tratta di un bug noto in iOS 7.0. – jasonjwwilliams

+1

questo è stato risolto in iOS 9 – Climbatize

risposta

23

Cambiare l'aspetto di una MFMailComposer attraverso misure normali non è possibile, ma c'è un po 'di soluzione che si può fare, che ho usato molte volte prima.

Aggiungi due metodi per la classe in cui si desidera implementare il nuovo look a:

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

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

Ora nel tuo metodo show, applicare la speciale interfaccia compositore cambia vuoi fare.

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

E nel proprio delegato, ripristinare l'interfaccia nel modo in cui era.

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

Questo è quello che faccio anche nelle mie app. Ho un paio di metodi setAppearance e unsetAppearance nel mio delegato dell'app che posso chiamare ovunque per attivare e disattivare tutte le personalizzazioni dell'interfaccia utente ogni volta che devo presentare un controller di visualizzazione prebaked standard (il controller di posta, il selettore di librerie di iPod, ecc.). – Ziconic

+2

@Ziconic, potresti dirmi come hai "disinserito" le tue proprietà di comparazione al volo? grazie – Pavan

2

La vista Mail Composer viene eseguita in un processo diverso in iOS 6 e non può essere manomessa direttamente (poiché la vista è essenzialmente all'interno di un'altra app). Non è possibile personalizzare ciò che mostra, è lo stesso per le viste su Twitter & di Facebook.

Ecco una descrizione più dettagliata dei controller a distanza di vista: http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/

+3

Anche se viene eseguito in un processo remoto, si tratta di un dettaglio di implementazione non esposto allo sviluppatore; per quanto riguarda lo sviluppatore, sembra lo stesso di prima. Suggerirei di archiviare un bug se non funziona; So che il meccanismo del controller di visualizzazione remoto fa almeno * qualcosa * con il meccanismo UIAppearance, perché ho i registri degli arresti anomali. :) –

+0

La vista principale è effettivamente in un processo diverso, ma la barra di navigazione e il controller di navigazione in cui si trova sono nello stesso processo della tua app e sono stilizzati in base alle personalizzazioni della tua UIA. – Ziconic

+0

@BJHomer Ho archiviato un radar. Sentiti libero di ingannare. rdar: // 13490724 – markdorison

1

semplicemente impostare il tintColor nell'istanza MFMailComposeViewController:

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