web-dev-qa-db-fra.com

Comment définir l'image pour le bouton de la barre avec swift?

J'essaie de définir un bouton Image pour le bouton de la barre pour lequel j'ai une image comme celle-ci:

enter image description here

avec une résolution de 30 * 30 mais pendant que j'assigne cette image au bouton Bar, il ressemble à:

enter image description here

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

enter image description here

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?

42
Dharmesh Kheni

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:

 enter image description here

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:

 enter image description here

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

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.

25
Anibal Rodriguez

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
16
jungledev

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
    }
}
14
Jovan Stankovic

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) 
{

}
6
Sreekumar .K

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: 

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 trouver de telles icônes sur la plupart des sites d'icônes de barre d'onglets gratuits.

enter image description here

5
aparna

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:

 enter image description here

4
Mr.Javed Multani

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))
0
Eric Ford

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
0
Craig