2016-03-22 5 views
1

Ich habe eine UIBarButton in meiner Navigationsleiste, habe ich ein Bild (silhouette.png), um es aus dem Storyboard ändern, und ich kann das Bild der Farbton (Farbe) nach Belieben ändern:Kann nicht UIBarButton tintColor

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

jedoch irgendwann ändere ich das Originalbild für eine anderes Bild (icon.png), programmatisch, so brauche ich nicht den Farbton in diesem Fall zu ändern, so weit, so gut:

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") 
      } 
     } 

Das Problem kommt, wenn ich zum icon image auf die original silhouette.png umschalte, weil ich die tönung keine lo ändern kann nger, es bleibt immer blau silhoute (Standardfarbe), statt grün, rot, etc:

 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 

Was mache ich falsch, warum danach Farbton ändert igonred ?? Wenn Sie zusätzliche Informationen benötigen, lassen Sie es mich wissen.

+0

Haben Sie versucht, einen Verweis auf den Button zu speichern und nachdem er gesetzt und präsentiert wird, die Farbe an diesem Punkt ändern? – sschale

Antwort

1

Wenn Sie Google, wie das benutzerdefinierte Bild für Ihre Bar-Taste gesetzt ist, wird so ziemlich jeder sagen Sie UIButton erstellen und dann die UIBarButtonItem vom UIButton als customView: erstellen. In diesem Fall machst du hier das Richtige. Wenn Sie jedoch UIBarButtonItem über cutomView: erstellen, können Sie die tintColor nicht mehr ändern. Und das folgende ist, wie Sie benutzerdefiniertes Bild gesetzt und auch die 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 

Ändern Abhängig davon, wo werden Sie den Code oben anrufen, müssen Sie möglicherweise es in dieser Struktur setzen, um es in dem UI-Thread laufen zu lassen und machen die Änderung sichtbar:

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

Bro, du hast es geschafft. Vielen Dank!! Ich musste diesen Code nur in eine dispatch_async (dispatch_get_main_queue()) {// code here} einfügen, damit der Code im UI-Thread ausgeführt wird und die Änderungen sichtbar sind. Fügen Sie einfach diese zusätzliche Codezeile hinzu und ich gebe Ihnen das grüne Häkchen. @ Yuchen-Zhong – Josh

+0

Hey @Josh, froh zu wissen, dass es hilft :) Ich persönlich möchte nicht das Dispatching der Warteschlange in der Antwort hier hinzufügen, da es nicht mit der Frage, die Sie gefragt haben: ** warum kann ich nicht ändern die Tönungsfarbe **. Wenn Sie dies hinzufügen, wird die Frage/Antwort für andere Personen, die das gleiche Problem haben, komplizierter und weniger hilfreich. Und Sie sollten das nicht hinzufügen, wenn Sie wissen, dass Sie sich im UI-Thread befinden und nur versenden, wenn Sie sich im Hintergrund-Thread befinden. Insgesamt ist dispatch_async nicht billig. –

+0

Es macht Sinn, ich habe es als eine optionale Sache hinzugefügt, da einige Leute nicht darüber wissen und anfangen zu denken, dass der Code nicht funktioniert. (mich eingeschlossen, nicht lange her) @ Yuchen-Zhong – Josh

Verwandte Themen