2017-02-10 9 views
0

Ich benutze den MFMessageComposeViewController und den MFMailComposeViewController. Aus irgendeinem Grund wird nur der Mail VC mit den gewünschten Farben formatiert. Hier ist, wie ich die Navigationsleiste im AppDelegate innerhalb der DidFinish-Funktion style.Wie ändere ich die Farbe der Navigationsleiste für einen MFMessageComposeViewController?

let navigationBarAppearace = UINavigationBar.appearance() 
    navigationBarAppearace.tintColor = Styles.whiteColor() 
    navigationBarAppearace.barTintColor = Styles.inputColor() 
    navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName:Styles.whiteColor()] 
    navigationBarAppearace.isTranslucent = false 

Aber die Nachricht VC wird nicht von der AppDelegate entworfen, aber ich bin mir nicht sicher, warum nicht. Ich habe das versucht, aber nichts geändert. let controller = MFMessageComposeViewController()

 controller.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: Styles.positiveColor()] 
     controller.navigationBar.barTintColor = Styles.negativeColor() 
     controller.messageComposeDelegate = self 

die Nachricht VC harmoniert anders? Es erscheint immer noch mit der standardmäßigen weißen Navigationsleiste und der standardmäßigen blauen Abbruchtaste.

Hier ist ein Foto der E-Mail VC und der Message VC Navigationsleisten. enter image description here enter image description here

Wie Sie die Nachricht VC zu sehen ist, wie die E-Mail-VC Navigationsleiste Stil, nicht zu werden, aber ich bin mir nicht sicher, warum.

+0

Mögliches Duplikat von [Wie ändert man die Farbe der Navigationsleiste in mfmessagecomposeviewcontroller, während sie in ios 9 präsentiert wird] (http://stackoverflow.com/questions/33478646/how-to-change-color-of-navigation-bar- in-mfmessagecomposeviewcontroller-while-pr) – BJHStudios

+0

Es scheint keine Antwort zu meinem Problem auf dieser Seite zu geben. Sie scheinen herauszufinden, wie man den Mail-Controller, aber nicht den Nachrichten-Controller ändert. – icekomo

Antwort

1

Sie können eine Unterklasse von UINavigationBar (MyNavigationBar) erstellen, in der Sie alle erforderlichen Eigenschaften festlegen. Dann

, wie MFMessageComposeViewController erbt von UINavigationController, können Sie seine Initialisierungsmethode

init(navigationBarClass: AnyClass?, toolbarClass: AnyClass?) 

verwenden und MyNavigationBar Klasse als Parameter zur Verfügung stellen.

+0

Warum wird die Mail VC von AppDelegate, nicht aber von Mail VC gestylt? – icekomo

+0

Bitte klären Sie Ihre Frage. Ich habe es nicht verstanden. – DisableR

+0

Warum akzeptiert die Navigationsleiste für MFMailComposeViewController das in der AppDelegate-Datei festgelegte Styling, aber der MFMessageComposeViewController akzeptiert nicht das gleiche Styling. – icekomo

0

Folgendes ist für Swift 3/4.

Ich habe viele Möglichkeiten versucht, die auf StackOverflow und anderen Seiten gezeigt werden, einschließlich der in der obigen Antwort erwähnten Unterklassenweise. Es konnte jedoch kein Erfolg beim Ändern der Farbe oder Ändern der Schriftfarbe von UIBarButtons erzielt werden.

Dann versuchte verschiedene Art der Präsentation der MFMessageComposeViewController.

// Configures and returns a MFMessageComposeViewController instance. This is same with no change. 
func configuredMessageComposeViewController() -> MFMessageComposeViewController { 
    let messageComposeVC = MFMessageComposeViewController() 

    let fileManager:FileManager = FileManager.default 
    messageComposeVC.messageComposeDelegate = self // Make sure to set this property to self, so that the controller can be dismissed! 
    messageComposeVC.recipients = [myContactPhone] 

    if fileManager.fileExists(atPath: mySendImagePath) { 
     if let image = UIImage(contentsOfFile: mySendImagePath) { 
      if UIImagePNGRepresentation(image) != nil 
      { 
       let imageData1: Data = UIImagePNGRepresentation(image)! 
       let success = messageComposeVC.addAttachmentData(imageData1, typeIdentifier: "public.data", filename: "image.JPG") 

       if(success) 
       { 
       } 
       else{ 
       } 
      } 
     } 
    } 
    return messageComposeVC 
} 

// Following code is usage of above. 
    if (MFMessageComposeViewController.canSendText()) { 
     myMessageComposeVC = configuredMessageComposeViewController() 

     // old code - Instead of using following way 
     //present(messageComposeVC, animated: true, completion: nil) 

     // Used this way to use existing navigation bar. 
     if let messageComposeVC = myMessageComposeVC { 
      messageComposeVC.willMove(toParentViewController: self) 
      messageComposeVC.view.frame = self.view.frame 
      self.view.addSubview(messageComposeVC.view) 
      self.addChildViewController(messageComposeVC) 
      messageComposeVC.didMove(toParentViewController: self) 
     } 
    } else { 
     showSendMMSErrorAlert() 
     return 
    } 

// Following code to remove it when returned through delegate. 
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) { 

    // old code 
    //controller.dismiss(animated: true, completion: nil) 

    controller.willMove(toParentViewController: nil) 
    controller.view.removeFromSuperview() 
    controller.removeFromParentViewController() 

    if(result.rawValue == 0) 
    { 
     ... error ... 
    } else { 
     ... success ... 
    } 
} 

Hoffe, das ist nützlich für Personen wie mich.

Grüße.

Verwandte Themen