2016-09-08 61 views
8

在Swift 2中,我在Storyboard中使用了一個用戶定義的運行時屬性和一個tintColor的鍵路徑來更改標籤欄項目圖標的顏色。但是,它看起來像tintColor已被Swift 3刪除。我如何更改Swift 3中選項卡欄控制器中選項卡欄項目的選定顏色?標籤欄Swift 3中的按鈕顏色?

謝謝!

編輯:附截圖

enter image description here

+0

在Xcode 8 SWIFT 3試了一下,工作正常。您是否爲標籤欄本身或其中一個欄項目設置了色調顏色? –

+0

感謝您的回覆!我試圖設置單個項目的顏色。我只附加了一個截圖。 – winston

回答

10

使用tabBarItem.setTitleTextAttributes改變個人物品欄的文本顏色。

self.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.red()], for:.selected) 

要更改圖標和文本着色顏色在一起的簡單的解決方案是改變的TabBar色調色在每個標籤的viewWillAppear中方法:


viewDidLoad方法中的每個選項卡的將這個
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.tabBarController?.tabBar.tintColor = UIColor.red() 
} 

改變圖像色調顏色的另一種解決方案是爲UIImage創建一個擴展,並用它來改變所選圖像自定義色彩:

extension UIImage { 
    func tabBarImageWithCustomTint(tintColor: UIColor) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
     let context: CGContext = UIGraphicsGetCurrentContext()! 

     context.translate(x: 0, y: self.size.height) 
     context.scale(x: 1.0, y: -1.0) 
     context.setBlendMode(CGBlendMode.normal) 
     let rect: CGRect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height) 

     context.clipToMask(rect, mask: self.cgImage!) 

     tintColor.setFill() 
     context.fill(rect) 

     var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 

     newImage = newImage.withRenderingMode(UIImageRenderingMode.alwaysOriginal) 
     return newImage 
    } 
} 

使用此代碼更改所選圖像:

self.tabBarItem.selectedImage = self.tabBarItem.selectedImage?.tabBarImageWithCustomTint(tintColor: UIColor.red()) 
+0

對不起,我應該更具體。我想改變圖標的​​顏色。我已經想出瞭如何改變文字。謝謝! – winston

+0

@james請看我編輯的答案。 –

+0

這很好。謝謝!! – winston

0

最新的代碼面值夫特3

extension UIImage { 

    func tabBarImageWithCustomTint(tintColor: UIColor) -> UIImage { 

     UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
     let context: CGContext = UIGraphicsGetCurrentContext()! 

     context.translateBy(x: 0, y: self.size.height) 
     context.scaleBy(x: 1.0, y: -1.0) 
     context.setBlendMode(CGBlendMode.normal) 
     let rect: CGRect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height) 

     context.clip(to: rect, mask: self.cgImage!) 

     tintColor.setFill() 
     context.fill(rect) 

     var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 

     newImage = newImage.withRenderingMode(UIImageRenderingMode.alwaysOriginal) 
     return newImage 
    } 
}