如何移除左侧UIBarButtonItem的填充?

3
我想在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 ])

enter image description here

如何移除设置图标左侧的空格

更新。尝试了这段代码:

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)

enter image description here

当用户点击设置用户按钮时,出现问题。另外,导航标题未居中对齐。

请注意保留HTML标签。

5个回答

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

enter image description here

因此,这里的诀窍是将您的自定义按钮放入另一个容器视图中,如下所示:
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]

这将导致如下结果,

enter image description here

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

1
是的,这只是为了解释问题。您必须根据自己的需求调整大小/位置。还有一点需要注意的是,您也可以将导航标题设置为自定义视图,并使用给定的框架来调整其位置,以防将来需要。 - Kamran

1

请尝试这个。对我来说它很好用。如果这段代码不能正常工作,那么我会给你另一个解决方案。

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

请在视图中添加其他按钮,并根据需要设置视图的宽度。这可能对您有所帮助。谢谢。

自定义视图是什么意思? - Sanjukta
UIBarButtonItem(customView: btn) yeh @sanjukta - Farshid roohi
谢谢,它有所帮助。但问题还没有解决@sanjukta。 - Farshid roohi
请分享您的问题。 - Sanjukta
请将视图高度设置为64。因为导航栏+状态栏的高度为64。之后它可能会居中显示。 - Sanjukta
显示剩余2条评论

1
你可以设置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)

0

最不痛苦且实际上最干净的解决方案是隐藏左侧按钮,直接向navigationBar添加子视图,并使用好老的约束自定义其位置和大小。效果非常好。虽然没有在每种情况下进行测试,但似乎运行良好。


0

将 cRect 的 x 值设为零:

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

1
我认为UINavigationView忽略了框架原点,只使用宽度/高度。我想他可能需要在UIView中包含按钮,并使用该视图创建栏按钮项。显然要确保该视图不剪切他的按钮。 - ekscrypto
我已经尝试过了,但用户在点击按钮时遇到了麻烦。 - Farshid roohi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接