J'essaie de définir un bouton Image pour le bouton de la barre pour lequel j'ai une image comme celle-ci:
avec une résolution de 30 * 30 mais pendant que j'assigne cette image au bouton Bar, il ressemble à:
J'ai assigné l'image de cette façon:
et si j'essaie de cette façon, par exemple, de créer un IBOutlet pour le bouton et de définir Image par programme, forme this question et le code correspondant sont les suivants:
// 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, barMetrics: .Default)
mais rien ne se passe avec ça,
Quelqu'un peut-il me dire ce que je fais mal?
ou quelle est la façon la plus efficace de faire cela?
J'ai réalisé cela de manière programmée 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:
De la même manière, vous pouvez également définir le bouton pour le côté gauche:
self.navigationItem.leftBarButtonItem = barButton
Et le résultat sera:
Et si vous voulez avoir la même transaction que le contrôleur de navigation lorsque vous revenez en arrière avec le bouton Précédent par défaut, vous pouvez y parvenir avec le bouton Précédent 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")
}
}
Pour Swift 4.0:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//create a new button
let button = UIButton(type: .custom)
//set image for button
button.setImage(UIImage(named: "fb.png"), for: .normal)
//add function for button
button.addTarget(self, action: #selector(fbButtonPressed), for: .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.
@objc func fbButtonPressed() {
print("Share to fb")
}
}
Une solution facile peut être la suivante
barButtonItem.image = UIImage(named: "image")
puis allez dans Assets.xcassets, sélectionnez l’image, accédez à l’Inspecteur d’attributs, puis sélectionnez "Image originale" dans Reder en option.
Semblable à la solution acceptée, mais vous pouvez remplacer le
let button: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
avec
let button = UIButton()
Voici la solution complète, appréciez: (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
Voici une simple extension
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 la dernière version de 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 du réglage dans IB, elle était bleue et lors de la définition directement dans UIButton, elle était noire). Il se trouve que je pouvais 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
Seulement deux lignes de code nécessaires 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)
{
}
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'onglets 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.
A partir des lignes directrices:
Quelque chose qui serait possible ressemble à ceci. Vous pouvez trouver de telles icônes sur la plupart des sites d'icônes de barre d'onglets gratuits.
Vous pouvez utiliser ce code pour un bouton à barres multiples avec une image personnalisée:
self.navigationItem.leftBarButtonItem = nil
let button = UIButton(type: .custom)
button.setImage(UIImage (named: "ChatTab"), for: .normal)
button.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0)
//button.addTarget(target, action: nil, for: .touchUpInside)
let barButtonItem = UIBarButtonItem(customView: button)
let button2 = UIButton(type: .custom)
button2.setImage(UIImage (named: "ActivityTab"), for: .normal)
button2.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0)
//button.addTarget(target, action: nil, for: .touchUpInside)
let barButtonItem2 = UIBarButtonItem(customView: button2)
self.navigationItem.rightBarButtonItems = [barButtonItem, barButtonItem2]
Le résultat sera ceci:
Swift 4.
@IBOutlet weak var settingBarBtn: UIBarButtonItem! {
didSet {
let imageSetting = UIImageView(image: UIImage(named: "settings"))
imageSetting.image = imageSetting.image!.withRenderingMode(.alwaysOriginal)
imageSetting.tintColor = UIColor.clear
settingBarBtn.image = imageSetting.image
}
}
Initialisez barbuttonItem comme suit:
let pauseButton = UIBarButtonItem(image: UIImage(named: "big"),
style: .plain,
target: self,
action: #selector(PlaybackViewController.pause))
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