如何删除左 UIBarButtonItem 的填充?

Posted

技术标签:

【中文标题】如何删除左 UIBarButtonItem 的填充?【英文标题】:how to remove padding left UIBarButtonItem? 【发布时间】:2018-07-19 06:06:06 【问题描述】:

我想在 UINavigationController 中使用 自定义视图 作为 UIBarButtonItem,是否可以在此处删除左侧填充?

我已经试过了:

let  btn = UIButton()
btn.frame = CGRect(x: -50, y: -50, width: 44, height: 50)
btn.setImage(UIImage(name:"img").withRenderingMode(.alwaysTemplate), for: .normal)
btn.addTarget(self, action: #selector(openSetting), for: .touchUpInside)

let leftButtonBar = UIBarButtonItem(customView: btn)

self.navigationItem.leftBarButtonItems = ( [leftButtonBar , otherBtn ])

如何去掉空格左设置图标

更新。累了这段代码:

let view = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 
view.backgroundColor = .gray
let  btn = UIButton()
btn.frame = CGRect(x: -15, y: 0, width: 44, height: 50)
btn.setImage(UIImage(name:"img").withRenderingMode(.alwaysTemplate), for: .normal)
btn.addTarget(self, action: #selector(DashboardTabBarController.openSetting), for: .touchUpInside)
view.addSubview(btn)
let leftButtonBar = UIBarButtonItem(customView: view)

单击 btn 设置用户时此用户有问题 和其他问题 title 导航不是 center align

【问题讨论】:

【参考方案1】:

您应该已经注意到,无论您为自定义视图提供什么x 值,即btn,它将始终从相同的位置开始,因为内部导航栏不计入为该项目提供的位置并且它始终如下图所示设置内部定义的位置,我将背景颜色设置为自定义按钮以获得更好的视觉效果。

因此,这里的技巧是将您的自定义按钮放入另一个容器视图中,如下所示,

let view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 200, height: 50)))
view.backgroundColor = .green
let  btn = UIButton(frame: CGRect(x: -10, y: 10 , width: 30, height: 30))
btn.setImage(UIImage(named: "cancelled")?.withRenderingMode(.alwaysTemplate), for: .normal)
btn.addTarget(self, action: #selector(openSetting), for: .touchUpInside)
btn.backgroundColor = .yellow
btn.tintColor = .red
view.addSubview(btn)

let  btn2 = UIButton(frame: CGRect(x: 20, y: 10, width: 30, height: 30))
btn2.setImage(UIImage(named: "cancelled")?.withRenderingMode(.alwaysTemplate), for: .normal)
btn2.contentMode = .scaleAspectFit
btn2.tintColor = .yellow
btn2.addTarget(self, action: #selector(openSetting), for: .touchUpInside)
view.addSubview(btn2)

let itemsContainer = UIBarButtonItem(customView: view)
self.navigationItem.leftBarButtonItems = [itemsContainer]

这会导致这个,

现在,如果您更改btnxywidthheight,它会相应地调整。

【讨论】:

是的,这只是为了解释问题。您必须根据需要调整大小/位置。还有一点需要注意的是,您可以将导航标题设置为自定义视图,也可以使用给定的框架来调整其位置,以防您以后想这样做。【参考方案2】:

请试试这个。这对我来说可以。如果这段代码不能正常工作,我会给你另一个解决方案。

   let view = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
    let  btn = UIButton()
    btn.frame = CGRect(x: -15, y: 0, width: 44, height: 50)
    btn.setImage(UIImage(name:"img").withRenderingMode(.alwaysTemplate), for: .normal)
    btn.addTarget(self, action: #selector(openSetting), for: .touchUpInside)
    view.addSubview(btn)
    let leftButtonBar = UIBarButtonItem(customView: view)
    self.navigationItem.leftBarButtonItems = ( [leftButtonBar])

请在视图中添加其他按钮并设置相应的视图宽度。它可能对你有帮助。谢谢

【讨论】:

自定义视图是什么意思?? UIBarButtonItem(customView: btn) 是的@sanjukta 谢谢,它有帮助但问题没有解决@sanjukta 请分享您的问题。 请将视图高度设置为64。因为导航栏+层状栏高度为64。之后可能会显示在中心【参考方案3】:

您可以设置imageInsets 并设置图像这是左边距的示例,以在默认后退按钮的位置设置后退图像

 let rightBtn = UIBarButtonItem(image: UIImage(named: "BackArrow"), style: .done, target: self, action: #selector(actnClose))
 rightBtn.imageInsets = UIEdgeInsets(top: 0, left: -12, bottom: 0, right: 0)
    
 self.navigationItem.setLeftBarButton(rightBtn, animated: true)

【讨论】:

【参考方案4】:

将 cRect 的 x 值设置为零:

btn.frame = CGRect(x: 0, y: -50, width: 44, height: 50)

【讨论】:

我认为 UINavigationView 忽略了框架原点,它只使用宽度/高度。我在想他可能必须将他的按钮包含在 UIView 中,并使用该视图来创建条形按钮项。显然要确保该视图不会夹住他的按钮.. 我已经尝试过了,但是用户在点击按钮时遇到了麻烦【参考方案5】:

不那么痛苦且实际上最干净的解决方案是隐藏左按钮,只需将子视图直接添加到导航栏,并使用良好的旧约束自定义它的位置和大小。像魅力一样工作。尚未在所有情况下都对其进行测试,但似乎可以正常工作。

【讨论】:

以上是关于如何删除左 UIBarButtonItem 的填充?的主要内容,如果未能解决你的问题,请参考以下文章

在导航栏中放置一个基于自定义视图的 UIBarButtonItem 而没有默认的水平填充

Android复选框如何删除左填充

如何在 UINavigationBar [iOS 7] 中编辑左、右 UIBarButtonItem 的空白

wpf删除数据网格左填充

如何从 UIBarButtonItem 中删除样式?

添加/删除其他 UIBarbuttons 时如何保持 UIBarButtonItem 居中?