2013-03-22 6 views
17

Ich verwende das UIAppearance-Protokoll, um das Hintergrundbild von UINavigationBar-Objekten in meiner App festzulegen.UIAppearance-Eigenschaft für MFMailComposeViewController überschreiben

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

Ich möchte dies für Fälle von MFMailComposeViewController außer Kraft zu setzen, so dass die Navigationsleiste Standardstil angezeigt wird. Ich versuchte appearanceWhenContainedIn zu verwenden, um dies zu setzen und das funktioniert auf iOS 5 aber nicht auf iOS 6.

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

Bin ich einen Fehler machen oder gibt es einen besseren Weg, dies zu erreichen?

+0

Laut Apple Developer Support: Es ist ein bekannter Fehler in iOS 7.0. – jasonjwwilliams

+1

Dies ist in iOS behoben 9 – Climbatize

Antwort

23

Ändern der Darstellung eines MFMailComposer durch normale Maßnahmen nicht möglich ist, aber es ist ein wenig Abhilfe Sie tun können, die ich viele Male verwendet haben Vor.

Fügen Sie zwei Methoden, um die Klasse, in der Sie den neuen Look implementieren möchten:

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

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

Jetzt in der Show-Methode gelten die speziellen Komponist Schnittstelle ändert würden Sie gerne machen.

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

Und in Ihrem Delegaten, ändern Sie die Schnittstelle zurück, wie es war.

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

Das mache ich auch in meinen eigenen Apps. Ich habe ein paar setAppearance- und unsetAppearance-Methoden in meinem App-Delegaten, die ich überall aufrufen kann, um alle meine UI-Anpassungen ein- und auszuschalten, wenn ich einen standardmäßigen vorgebackenen View-Controller (den Mail-Controller, den iPod-Bibliothekswähler usw.) präsentieren muss. – Ziconic

+2

@Ziconic, können Sie mir bitte sagen, wie Sie Ihre UI-Eigenschaften bei laufendem Betrieb "unscharf" setzen? Danke – Pavan

2

Die Mail Composer-Ansicht wird in einem anderen Prozess unter iOS 6 ausgeführt und kann nicht direkt manipuliert werden (da sich die Ansicht im Wesentlichen in einer anderen App befindet). Sie können nicht anpassen, was es zeigt, es ist das gleiche für die Twitter-Ansichten & Facebook. Hier

ist eine detailliertere Beschreibung der Remote-View-Controller: http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/

+3

Obwohl es in einem Remote-Prozess ausgeführt wird, ist das ein Implementierungsdetail, das nicht dem Entwickler ausgesetzt ist; Soweit der Entwickler betroffen ist, sieht es genauso aus wie zuvor. Ich würde vorschlagen, einen Fehler zu archivieren, wenn es nicht funktioniert; Ich weiß, dass der Remote-View-Controller-Mechanismus mindestens * etwas * mit dem UIAppearance-Mechanismus macht, weil ich dort Absturz-Logs habe. :) –

+0

Die Hauptansicht befindet sich zwar in einem anderen Prozess, aber die Navigationsleiste und der Navigationscontroller, auf dem sie sich befinden, befinden sich im selben Prozess wie Ihre App und werden gemäß Ihren UIA-Anpassungen angepasst. – Ziconic

+0

@BJHomer Ich meldete ein Radar an. Fühlen Sie sich frei zu täuschen. rdar: // 13490724 – markdorison

1

setzen Sie einfach die tintColor auf dem MFMailComposeViewController Beispiel:

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