Comment définir l'image pour le button de barre avec Swift?

J'essaye de placer une image pour l'article de button de barre pour que j'ai une image comme:

entrez la description de l'image ici

avec la résolution 30 * 30 mais pendant que j'assigne ce button Image to Bar Son ressemble à:

entrez la description de l'image ici

J'ai assigné l'image de cette façon:

entrez la description de l'image ici

et Si j'essaie de cette manière de créer un IBOutlet pour le button et de définir Image par programme, formatez cette question et le code pour cela:

// Outlet for bar button @IBOutlet weak var fbButton: UIBarButtonItem! // Set Image for bar button var backImg: UIImage = UIImage(named: "fb.png")! fbButton.setBackgroundImage(backImg, forState: .Normal, barMesortingcs: .Default) 

mais rien ne se passe avec ça,

Quelqu'un peut-il me dire ce que je fais mal?

ou quel est le moyen de faire cela?

J'ai atteint ce programme avec ce code:

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //create a new button let button: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton //set image for button button.setImage(UIImage(named: "fb.png"), forState: UIControlState.Normal) //add function for button button.addTarget(self, action: "fbButtonPressed", forControlEvents: UIControlEvents.TouchUpInside) //set frame button.frame = CGRectMake(0, 0, 53, 31) let barButton = UIBarButtonItem(customView: button) //assign button to navigationbar self.navigationItem.rightBarButtonItem = barButton } //This method will call when you press button. func fbButtonPressed() { println("Share to fb") } } 

Et le résultat sera:

entrez la description de l'image ici

De la même façon que vous pouvez définir le button pour le côté gauche de cette façon:

 self.navigationItem.leftBarButtonItem = barButton 

Et le résultat sera:

entrez la description de l'image ici

Et si vous voulez la même transaction que le controller de navigation quand vous revenez avec le button de return par défaut, vous pouvez le faire avec le button de return personnalisé avec ce code:

 func backButtonPressed(sender:UIButton) { navigationController?.popViewControllerAnimated(true) } 

Pour swift 3.0:

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //create a new button let button = UIButton.init(type: .custom) //set image for button button.setImage(UIImage(named: "fb.png"), for: UIControlState.normal) //add function for button button.addTarget(self, action: #selector(ViewController.fbButtonPressed), for: UIControlEvents.touchUpInside) //set frame button.frame = CGRect(x: 0, y: 0, width: 53, height: 51) let barButton = UIBarButtonItem(customView: button) //assign button to navigationbar self.navigationItem.rightBarButtonItem = barButton } //This method will call when you press button. func fbButtonPressed() { print("Share to fb") } } 

Semblable à la solution acceptée, mais vous pouvez replace le

 let button: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton 

avec

 let button = UIButton() 

Voici la solution complète, profitez-en: (c'est juste un peu plus propre que la solution acceptée)

 let button = UIButton() button.frame = CGRectMake(0, 0, 51, 31) //won't work if you don't set frame button.setImage(UIImage(named: "fb"), forState: .Normal) button.addTarget(self, action: Selector("fbButtonPressed"), forControlEvents: .TouchUpInside) let barButton = UIBarButtonItem() barButton.customView = button self.navigationItem.rightBarButtonItem = barButton 

Une solution facile peut être la suivante

 barButtonItem.image = UIImage(named: "image") 

Puis allez dans votre Assets.xcassets select l'image et allez à l'inspecteur d'attributes et select "Original Image" dans Reder comme option.

Voici une extension simple sur UIBarButtonItem :

 extension UIBarButtonItem { class func itemWith(colorfulImage: UIImage?, target: AnyObject, action: Selector) -> UIBarButtonItem { let button = UIButton(type: .custom) button.setImage(colorfulImage, for: .normal) button.frame = CGRect(x: 0.0, y: 0.0, width: 44.0, height: 44.0) button.addTarget(target, action: action, for: .touchUpInside) let barButtonItem = UIBarButtonItem(customView: button) return barButtonItem } } 

J'utilise le dernier swift (2.1) et la réponse (Dharmesh Kheni et jungledev) ne fonctionne pas pour moi. La couleur de l'image était désactivée (lors de la configuration dans IB, elle était bleue et lors de la configuration directe dans UIButton, elle était noire). Il s'avère que je pourrais créer le même élément de barre avec le code suivant:

 let barButton = UIBarButtonItem(image: UIImage(named: "menu"), landscapeImagePhone: nil, style: .Done, target: self, action: #selector(revealBackClicked)) self.navigationItem.leftBarButtonItem = barButton 

Votre problème est dû à la façon dont l'icône a été créée: elle n'est pas conforme aux spécifications de l'icône de la barre d'tabs personnalisée d'Apple:

 To design a custom bar icon, follow these guidelines: Use pure white with appropriate alpha transparency. Don't include a drop shadow. Use antialiasing. 

À partir des lignes direcsortingces:

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/BarIcons.html#//apple_ref/doc/uid/TP40006556-CH21-SW1

Quelque chose qui serait possible ressemble à ceci. Vous pouvez find ces icons sur la plupart des sites gratuits de l'icône de la barre d'tabs.

entrez la description de l'image ici

Seulement deux lignes de code requirejses pour cela

Swift 3.0

 let closeButtonImage = UIImage(named: "ic_close_white") navigationItem.rightBarButtonItem = UIBarButtonItem(image: closeButtonImage, style: .plain, target: self, action: #selector(ResetPasswordViewController.barButtonDidTap(_:))) func barButtonDidTap(_ sender: UIBarButtonItem) { } 

Si votre UIBarButtonItem est déjà alloué comme dans un storyboard. (printBtn)

  let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30)) btn.setImage(UIImage(named: Constants.ImageName.print)?.withRenderingMode(.alwaysTemplate), for: .normal) btn.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handlePrintPress(tapGesture:)))) printBtn.customView = btn