2016-03-22 49 views
1

我有一個UIBarButton在我的導航欄,我的圖像(silhouette.png)從故事板設置爲它,我可以隨意改變圖像的色調(顏色):不能修改UIBarButton tintColor

if let num2 = Int(s, radix: 16) { //s="00ff00" 
     flamingoBtn.tintColor = UIColor(netHex:num2) //this btn is an IBoutlet 
    } 

然而,在某些時候我換另一張圖片(的icon.png)原始圖像,編程,所以我並不需要改變色調在這種情況下,到目前爲止好:

if let url = NSURL(string: "http://www.123di.com/CanonSGLens_132.png") { 
      if let data = NSData(contentsOfURL: url) { 
       var newImgThumb : UIImage=UIImage(data: data)! 

       var iconBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 35, height: 35)) 
       iconBtn.setImage(newImgThumb, forState: UIControlState.Normal) 
       iconBtn.addTarget(self, action: "goToSettings:", forControlEvents: UIControlEvents.TouchUpInside) 
       var item = UIBarButtonItem(customView: iconBtn) 
       self.navigationItem.leftBarButtonItem = item 
       print("CUSTOM ICON: DOWNLOADED") 
      } 
     } 

問題當我切換到圖標圖像到原始的silhouette.png時,我無法修改任何色調手指,它始終保持藍色silhoute(默認顏色),而不是綠色,紅色等:

 var newImgThumb : UIImage=UIImage(named: "happyface.png")! 
     var replyBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 35, height: 35)) 
     replyBtn.setImage(newImgThumb, forState: UIControlState.Normal) 
     replyBtn.addTarget(self, action: "goToSettings:", forControlEvents: UIControlEvents.TouchUpInside) 
     replyBtn.tintColor = UIColor.greenColor() 
     var item = UIBarButtonItem(customView: replyBtn) 
     item.tintColor = UIColor.greenColor()//UIColor(netHex:num2) 
     self.navigationItem.leftBarButtonItem = item 

我在做什麼錯,爲什麼色調變化之後igonred? 如果你需要額外的細節讓我知道。

+0

您是否嘗試存儲對該按鈕的引用,並在設置並呈現後,更改該點的色調顏色? – sschale

回答

1

如果谷歌如何爲您的欄按鈕的自定義圖像,幾乎每個人都會告訴你創建一個UIButton,然後創建一個從UIButtonUIBarButtonItemcustomView:。在這種情況下,你在這裏做的是正確的事情。

但是,如果您通過cutomView:創建了UIBarButtonItem,則無法再更改tintColor。這下面是你如何設置自定義圖像,也改變了tintColor

let item = UIBarButtonItem.init(image: UIImage(named: "happyface.png")!, 
       style: .Plain, 
       target: self, 
       action: Selector("goToSettings:")) 
    item.tintColor = UIColor.greenColor() 
    self.navigationItem.leftBarButtonItem = item 

取決於你在哪裏調用上面的代碼,你可能需要把它這個結構裏面,以使其在UI線程中運行,使更改可見:

dispatch_async(dispatch_get_main_queue()) { 
//code here 
} 
+0

兄弟,你釘了它。謝謝!!我只需將該代碼包裝在dispatch_async(dispatch_get_main_queue()){// code here}中,以便代碼在UI線程中執行並且可以看到更改。只需添加額外的代碼行,我會給你那個綠色的勾號。 @ Yuchen-Zhong – Josh

+0

嘿@Josh,很高興知道它有幫助:)我個人不希望在這裏添加隊列調度,因爲它與你所問的問題無關:**爲什麼我不能改變色調**。添加這個將會使問題/答案更復雜,並且對於有同樣問題的其他人更沒有幫助。如果你知道你在UI線程中,並且只在後臺線程中調度,那麼你不應該添加它。總的來說,dispatch_async並不便宜。 –

+0

它是有道理的,我已經添加它作爲一個可選的東西,因爲有些人不知道它,並開始認爲代碼不起作用。 (包括我在內,不久前)@雨辰鍾 – Josh