Ios 如何使用swift设置条形按钮的图像?
我正在尝试为具有如下图像的工具栏按钮项设置图像: 分辨率为30*30,但当我将此图像指定给Bar按钮时,其外观如下: 我以这种方式分配图像: 如果我尝试这种方式,比如为按钮制作一个IBOutlet,并通过编程设置图像,那么问题和代码就是: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
// 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中将图像添加到资源
时,只需选择原始图像
选项
谢谢你的回复,你能给我一个网站,让我下载这种图片吗?很好的解决方案。我认为您不需要将其强制转换为UIButtonlet 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)
}