Ios 如何使用swift设置条形按钮的图像?

Ios 如何使用swift设置条形按钮的图像?,ios,swift,uiimage,uibarbuttonitem,Ios,Swift,Uiimage,Uibarbuttonitem,我正在尝试为具有如下图像的工具栏按钮项设置图像: 分辨率为30*30,但当我将此图像指定给Bar按钮时,其外观如下: 我以这种方式分配图像: 如果我尝试这种方式,比如为按钮制作一个IBOutlet,并通过编程设置图像,那么问题和代码就是: // Outlet for bar button @IBOutlet weak var fbButton: UIBarButtonItem! // Set Image for bar button var backImg: UIImage = UI

我正在尝试为具有如下图像的工具栏按钮项设置图像:

分辨率为30*30,但当我将此图像指定给Bar按钮时,其外观如下:

我以这种方式分配图像:

如果我尝试这种方式,比如为按钮制作一个IBOutlet,并通过编程设置图像,那么问题和代码就是:

 // 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)
但这一切都没有发生

有人能告诉我我做错了什么吗


或者哪种方式更适合这样做?

您的问题在于图标的制作方式-它不符合苹果的自定义选项卡栏图标规格:

要设计自定义栏图标,请遵循以下准则:

  • 使用具有适当alpha透明度的纯白色
  • 不要包含阴影
  • 使用抗锯齿
(摘自)

可能的事情是这样的。你可以在大多数免费的标签栏图标网站上找到这样的图标


我通过以下代码编程实现了这一点:

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")
    }
}
func backButtonPressed(sender:UIButton) {
    navigationController?.popViewControllerAnimated(true)
}
结果将是:

同样,您也可以通过以下方式设置左侧的按钮:

self.navigationItem.leftBarButtonItem = barButton
结果将是:

如果您希望在使用默认返回按钮返回时,与导航控制器具有相同的事务,那么您可以使用以下代码使用自定义返回按钮来实现:

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")
    }
}
func backButtonPressed(sender:UIButton) {
    navigationController?.popViewControllerAnimated(true)
}
对于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")
    }
}
对于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")
    }
}

与公认的解决方案类似,但您可以替换

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

这是完整的解决方案,请欣赏:(它只是比公认的解决方案更干净一点)

我正在使用最新的swift(2.1),答案(Dharmesh Kheni和jungledev)对我不适用。图像颜色已关闭(在IB中设置时为蓝色,直接在UIButton中设置时为黑色)。事实证明,我可以使用以下代码创建相同的条形项目:

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

这里有一个简单的
扩展
关于
uibarbuttoneim

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
    }
}

下面是一个简单的解决方案

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

然后转到您的Assets.xcsets选择图像并转到属性检查器,然后在Reder as选项中选择“原始图像”。

此操作只需要两行代码

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

}

如果你的UIBarButtonItem已经像故事板一样分配了。 (打印BTN)


您可以将此代码用于自定义图像的多条按钮:

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]
结果如下:

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]
斯威夫特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:

let pauseButton = UIBarButtonItem(image: UIImage(named: "big"),
                                  style: .plain,
                                  target: self,
                                  action: #selector(PlaybackViewController.pause))
迅捷
.navigationBarItems
修改器可以获取您想要的任何视图:

struct ContentView: View {
     var body: some View {
        NavigationView {
            Text("SwiftUI")
            .navigationBarItems(leading:
                HStack {
                    Image(systemName: "trash")
                    Text("Trash")
                }
            )
        }
    }
}


如果您需要对每一个按钮执行操作,则可以对它们使用一个按钮。

如果您已在情节提要中使用图像设置UIBarButtonim,更改渲染模式的一个小技巧是将以下代码添加到viewDidLoad()。这样,您就不必在代码中添加整个按钮和图像

if let navButton = self.navigationItem.leftBarButtonItem, let buttonImage = navButton.image {
    navButton.image = buttonImage.withRenderingMode(.alwaysOriginal)
}

在Xcode中将图像添加到
资源
时,只需选择
原始图像
选项



谢谢你的回复,你能给我一个网站,让我下载这种图片吗?很好的解决方案。我认为您不需要将其强制转换为UIButton
let button:UIButton=UIButton.buttonWithType(UIButtonType.Custom)as!UIButton
实际上,在Swift 2.1中我们有这样一个:
让button:UIButton=UIButton(type:UIButtonType.Custom)
对于Swift 4,您还需要向
按钮添加宽度和高度约束锚,并将其
翻译自动调整大小GMaskintoConstraints
设置为false。例如,
button.widthAnchor.constriant(equalToConstant:53)。isActive=true
button.heightAnchor.constraint(equalToConstant:51)。isActive=true
在fbButtonPressed@AbdulWaheed这是不正确的,因为它不需要任何争论。你是了不起的海蒂!对于swift 4,您还需要将宽度和高度约束锚定添加到
按钮
,并将其
translatesAutoresizingMaskIntoConstraints
设置为false。例如,
button.widthAnchor.constriant(equalToConstant:51)。isActive=true
button.heightAnchor.constraint(equalToConstant:31)。isActive=true
有时答案比我们想象的简单。之前,我创建了一个新的UIBarButtonItem,它与我试图更改的图像一起初始化,并将其分配给当前的UIBarButtonItem。显然,你不必那么做。只需将当前uibarbuttonite的image属性设置为我试图更改的图像。此外,如果图像不在资源目录中,则可以使用UIImage扩展名.withRenderingMode(.alwaysOriginal)实现相同的功能。UIImage(名为:“image”)。使用RenderingMode(.alwaysOriginal)这是这个问题的最简单答案。它应该是被接受的,而不是上面那些过于劳累的。谢谢!它又短又甜,太棒了!短!并用适当的颜色为UIBarButton!对于swift 4,您还需要将宽度和高度约束锚定添加到
按钮
,并将其
translatesAutoresizingMaskIntoConstraints
设置为false。例如,
button.widthAnchor.constriant(equalToConstant:44)。isActive=true
button.heightAnchor.constraint(equalToConstant:44).isActive=true
self.navigationItem.leftBarButtonItem=nil为什么这行他必须返回按钮
如何使用它?像这样使用内部视图控制器:@IBOutlet弱var profileBarButton:UIBarButtonItem!{didSet{let imageSetting=UIImageView(图像:UIImage(名为:“staticUserProfile”))imageSetting.image=imageSetting.image!。withRenderingMode(.alwaysOriginal)imageSetting.tintColor=UIColor.clear profileBarButton.image=imageSetting.image}
.navigationBarItems(leading: Image(systemName: "trash.fill"),
                    trailing: Image(systemName: "trash")
)
if let navButton = self.navigationItem.leftBarButtonItem, let buttonImage = navButton.image {
    navButton.image = buttonImage.withRenderingMode(.alwaysOriginal)
}