How to adjust space between two UIBarButtonItem in rightBarButtonItems How to adjust space between two UIBarButtonItem in rightBarButtonItems xcode xcode

How to adjust space between two UIBarButtonItem in rightBarButtonItems


Updated at Jul 2015

A better way to do this is to use storyboard (tested in Xcode 6.4). First, add a UINavigationItem; secondly, add a Bar Button Item; thirdly, add a view to the Bar Button Item you just created in step 2; fourthly, add as many buttons as you wish into that view you just dragged in; lastly, adjust the space with your mouse and constraints.

Related Questions

Can't assign multiple Buttons to UINavigationItem when using Storyboard with iOS 5

How to add buttons to navigation controller visible after segueing?


Old Answer (Only acceptable for small insets)

Use imageInsets property:

leftButton.imageInsets = UIEdgeInsetsMake(0.0, 0.0, 0, -15);rightButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, 0);

for three or more buttons, the middle one(s) get both insets:

leftButton.imageInsets = UIEdgeInsetsMake(0.0, 0.0, 0, -15);middleButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, -15);rightButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, 0);

For the right side buttons, be careful: the FIRST button in the item array is the RIGHT one:

rightButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, 0);middleButton.imageInsets = UIEdgeInsetsMake(0.0, -15, 0, -15);leftButton.imageInsets = UIEdgeInsetsMake(0.0, 0.0, 0, -15);

IMPORTANT: Split the inset between the two neighbors; if apply the entire inset to one edge, it will become obvious that the buttons are overlapping in the "blank" space - one button gets all of the "gap" touches. Even when "split" the adjustment like this, at -40 on both edges, the tap will definitely go to wrong button sometimes. -15 or -20 is the most to consider using with this technique.

By applying this method, the button could even be moved around in four directions.


My solution is using a custom view for right bar buttons. Create a horizontal stackview with equal spacing and add any number of buttons as subview.

Sample code:

func addRightBarButtonItems(){    let btnSearch = UIButton.init(type: .custom)    btnSearch.setImage(UIImage(named: "icon-search"), for: .normal)    btnSearch.addTarget(self, action: #selector(MyPageContainerViewController.searchButtonPressed), for: .touchUpInside)    let btnEdit = UIButton.init(type: .custom)    btnEdit.setImage(UIImage(named: "icon-edit"), for: .normal)    btnEdit.addTarget(self, action: #selector(MyPageContainerViewController.editButtonPressed), for: .touchUpInside)    let stackview = UIStackView.init(arrangedSubviews: [btnEdit, btnSearch])    stackview.distribution = .equalSpacing    stackview.axis = .horizontal    stackview.alignment = .center    stackview.spacing = 8    let rightBarButton = UIBarButtonItem(customView: stackview)    self.navigationItem.rightBarButtonItem = rightBarButton}


First:

For UIBarButtonItem you must use constructor init(customView: UIView)

Second:

Use fixedSpace for set space between buttons

example:

let firstButton = UIButton()let firstButtonItem = UIBarButtonItem(customView: firstButton)let secondButton = UIButton()let secondButtonItem = UIBarButtonItem(customView: secondButton)let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)space.width = WIDTHself.navigationItem.rightBarButtonItems = [firstButtonItem, space, secondButtonItem]