2017-02-10 30 views
0

我正在使用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://stackoverflow.com/questions/33478646/how-to-change-color-of-navigation-bar- in-mfmessagecomposeviewcontroller-while-pr) – BJHStudios

+0

似乎沒有關於我在該頁上的問題的答案。他們似乎想出如何更改郵件控制器,但不是郵件控制器。 – icekomo

回答

1

您可以創建UINavigationBarMyNavigationBar)的子類,在其中設置所有必需的屬性。從UINavigationController

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

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

,並提供MyNavigationBar類作爲參數。

+0

爲什麼郵件VC獲取AppDelegate而不是郵件VC的樣式? – icekomo

+0

請澄清你的問題。我沒有明白。 – DisableR

+0

爲什麼MFMailComposeViewController的導航欄接受AppDelegate文件中的樣式集,但是MFMessageComposeViewController不接受相同的樣式。 – icekomo

0

以下是Swift 3/4。

我嘗試了很多方式顯示在StackOverflow和其他網站上,包括上面提到的答案中提到的子類方法。但無法成功更改顏色或更改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 ... 
    } 
} 

希望,這對像我這樣的人很有用。

問候。