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]