Ich versuche, ein Bild für die Schaltflächenschaltfläche festzulegen, für das ich ein Bild wie:
mit einer Auflösung von 30 * 30, aber während ich dieses Bild der Bar-Schaltfläche zuweisen, sieht es so aus:
Ich habe Bild auf diese Weise zugewiesen:
und wenn ich auf diese Weise versuche, ein IBOutlet für die Schaltfläche zu erstellen und Image programmatisch als diese Frage und den entsprechenden Code festzulegen, lautet:
// 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)
aber damit ist nichts passiert,
Kann mir jemand sagen, was ich falsch mache?
oder was ist der Teig Weg, dies zu tun?
Das ist mir programmatisch mit diesem Code gelungen:
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")
}
}
Und das Ergebnis wird sein:
Auf die gleiche Weise können Sie auch die linke Seite so einstellen:
self.navigationItem.leftBarButtonItem = barButton
Und das Ergebnis wird sein:
Wenn Sie dieselbe Transaktion wie der Navigations-Controller haben möchten, wenn Sie mit der Standard-Zurück-Schaltfläche zurückgehen, können Sie dies mit der benutzerdefinierten Zurück-Schaltfläche mit diesem Code erreichen:
func backButtonPressed(sender:UIButton) {
navigationController?.popViewControllerAnimated(true)
}
Für 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")
}
}
Für 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")
}
}
Eine einfache Lösung kann die folgende sein
barButtonItem.image = UIImage(named: "image")
gehen Sie dann zu Assets.xcassets, wählen Sie das Bild aus, gehen Sie zum Attributinspektor und wählen Sie "Originalbild" in Reder als Option.
Ähnlich wie die akzeptierte Lösung, aber Sie können die ersetzen
let button: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
mit
let button = UIButton()
Hier ist die vollständige Lösung, genießen Sie: (es ist nur ein bisschen sauberer als die akzeptierte Lösung)
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
Hier ist eine einfache extension
auf 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
}
}
Ich verwende den neuesten Swift (2.1) und die Antwort (Dharmesh Kheni und Jungledev) funktioniert für mich nicht. Die Bildfarbe war deaktiviert (bei der Einstellung in IB war sie blau und bei der direkten Einstellung in UIButton war sie schwarz). Es stellt sich heraus, dass ich das gleiche Barelement mit dem folgenden Code erstellen könnte:
let barButton = UIBarButtonItem(image: UIImage(named: "menu"), landscapeImagePhone: nil, style: .Done, target: self, action: #selector(revealBackClicked))
self.navigationItem.leftBarButtonItem = barButton
Dazu sind nur zwei Codezeilen erforderlich
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)
{
}
Ihr Problem liegt in der Art und Weise, wie das Symbol erstellt wurde - es entspricht nicht den Apple-Symbolspezifikationen für die Registerkartensymbole:
To design a custom bar icon, follow these guidelines:
Use pure white with appropriate alpha transparency.
Don’t include a drop shadow.
Use antialiasing.
Aus den Richtlinien:
Etwas, das möglich wäre, sieht so aus. Solche Symbole finden Sie auf den meisten freien Symbolseiten.
Sie können diesen Code für mehrere Schaltflächen mit benutzerdefiniertem Bild verwenden:
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]
Ergebnis wird folgendes sein:
Schnell 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
}
}
BarbuttonItem wie folgt initialisieren:
let pauseButton = UIBarButtonItem(image: UIImage(named: "big"),
style: .plain,
target: self,
action: #selector(PlaybackViewController.pause))
Wenn Ihr UIBarButtonItem bereits wie in einem Storyboard zugewiesen ist. (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