如何更改MFMessageComposeViewController的导航栏颜色?

问题描述:

我正在使用MFMessageComposeViewController和MFMailComposeViewController。出于某种原因,只有邮件VC正在使用我想要的颜色进行样式设计。下面是我在didFinish func里AppDelegate中导航栏的样式。如何更改MFMessageComposeViewController的导航栏颜色?

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

但消息VC没有被AppDelegate设置,但我不确定为什么不。 我试过但没有改变。 令控制器= MFMessageComposeViewController()

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

是消息VC风格不同?它仍然显示默认的白色导航栏和默认的蓝色取消按钮。

这是电子邮件VC和消息VC导航栏的照片。 enter image description here enter image description here

正如你可以看到消息VC不被风格化,如电子邮件VC导航栏,但我不知道为什么。

+0

[如何更改mfmessagecomposeviewcontroller中的导航栏的颜色,同时在ios 9中呈现它]的可能的副本(http://*.com/questions/33478646/how-to-change-color-of-navigation-bar- in-mfmessagecomposeviewcontroller-while-pr) – BJHStudios

+0

似乎没有关于我在该页上的问题的答案。他们似乎想出如何更改邮件控制器,但不是邮件控制器。 – icekomo

您可以创建UINavigationBarMyNavigationBar)的子类,在其中设置所有必需的属性。从UINavigationController

然后,MFMessageComposeViewController继承,你可以使用它的初始化方法

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

,并提供MyNavigationBar类作为参数。

+0

为什么邮件VC获取AppDelegate而不是邮件VC的样式? – icekomo

+0

请澄清你的问题。我没有明白。 – DisableR

+0

为什么MFMailComposeViewController的导航栏接受AppDelegate文件中的样式集,但是MFMessageComposeViewController不接受相同的样式。 – icekomo

以下是Swift 3/4。

我尝试了很多方式显示在*和其他网站上,包括上面提到的答案中提到的子类方法。但无法成功更改颜色或更改UIBarButtons的字体颜色。

然后尝试不同的方式呈现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 ... 
    } 
} 

希望,这对像我这样的人很有用。

问候。