Search code examples
iosswiftuinavigationcontroller

how to remove padding left UIBarButtonItem?


I would like to use a custom View as UIBarButtonItem left in an UINavigationController, is it possible to remove the left padding here?

Ill alrady tried:

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

how to remove space left setting icon

update. tired this code:

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

problem this user when clicked btn setting user and other problem title navigation not center align


Solution

  • You should have noticed that whatever x value you provide to your custom view i.e, btn, it will always start from the same position because internally navigation bar doesn't count for position provided for that item and it always set the internally defined position as in below image, I set the background color to the custom button for better visuals.

    enter image description here

    So, the trick here is to put your custom button into another container view as below,

    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]
    

    This will result into this,

    enter image description here

    Now, if you change the x, y, width, height of btn, it will adjust accordingly.