web-dev-qa-db-fra.com

image pour l'élément du bouton de la barre de navigation swift

Je souhaite afficher une image dans la partie gauche de ma barre de navigation dans Swift.

J'ai essayé d'ajouter un élément de bouton de barre de navigation et d'y définir une image.

Le problème est que je dois utiliser une très petite image pour qu'elle tienne bien dans la barre de navigation. Mais faire une si petite image conduit à une pixellisation, en particulier sur les plus gros téléphones iPhone 6 et 6 Plus.

Existe-t-il un moyen d'utiliser une image de bonne qualité, puis de définir le cadre pour qu'il tienne dans les limites de la barre de navigation?

Ma tentative:

var image = UIImage(named: "Harp.png")

image = image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)

self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
self.navigationItem.leftBarButtonItem.frame = CGRectMake(0, 0, 53, 31)
//image.frame = CGRectMake(0, 0, 53, 31)

J'ai essayé de placer le cadre sur l'image d'abord, puis sur l'élément du bouton de la barre. Mais cela génère une erreur:

Le type d'expression est ambigu sans plus de contexte.

19
user2363025

Essaye ça

let button = UIButton(type: UIButtonType.Custom)
button.setImage(UIImage(named: "yourImageName.png"), forState: UIControlState.Normal)
button.addTarget(self, action:Selector("callMethod"), forControlEvents: UIControlEvents.TouchDragInside)
button.frame=CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)
self.navigationItem.leftBarButtonItems = [newBackButton,barButton]

Pour Swift 3

let button = UIButton.init(type: .custom)
button.setImage(UIImage.init(named: "yourImageName.png"), for: UIControlState.normal)
button.addTarget(self, action:#selector(ViewController.callMethod), for:.touchUpInside)
button.frame = CGRect.init(x: 0, y: 0, width: 30, height: 30) //CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem.init(customView: button)
            self.navigationItem.leftBarButtonItem = barButton

Voici l'action

func callMethod() {
//do stuff here
}
48
Avijit Nagare

Utilisez ce code:

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]

Sortie: enter image description here

6
Mr.Javed Multani

Swift 4 et 5:

let imageView = UIImageView(image: UIImage(named: "Harp"))
let buttonItem = UIBarButtonItem(customView: imageView)
self.navigationItem.leftBarButtonItem = buttonItem
2
elarcoiris

Il existe un moyen d'utiliser des images de différentes tailles, selon l'appareil. Cela s'appelle un catalogue d'actifs. Vous en aurez probablement déjà un dans votre projet, ou sinon, vous pouvez en ajouter un avec File > New > File > Resource > Asset Catalogue.

Dans votre catalogue d'actifs, vous pouvez avoir plusieurs "ensembles d'images" (ceux-ci seront affichés sur le côté gauche). Ajoutez un nouveau jeu d'images avec le "+" en bas. Pour chaque ensemble d'images, vous pouvez fournir des images différentes (par exemple de tailles différentes) pour chacun de @ 1x, @ 2x et @ 3x.

Ensuite, pour utiliser une de ces images dans le code, vous utilisez simplement UIImage(named: "name_of_image_set") - ne notez aucune extension. L'image correcte sera chargée, selon l'appareil.

J'espère que cela t'aides!

1
JoeFryer