How to adjust space between two UIBarButtonItem in rightBarButtonItems

前端 未结 14 2045
悲&欢浪女
悲&欢浪女 2020-12-08 06:44

I am using the following codes to add two button to self.navigationItem.rightBarButtonItems, and I think in iOS7, the space between two buttons are too wide, is there a way

相关标签:
14条回答
  • 2020-12-08 07:20

    My situation was about giving horizontal space to logOut Button to the right edge.

     func addLogOutButtonToNavigationBar(triggerToMethodName: String)
        {
            let button: UIButton = UIButton()
            button.setImage(UIImage(named: "logOff.png"), forState: .Normal)
            button.frame = CGRectMake(20, 0, 30, 25)
            button.contentEdgeInsets = UIEdgeInsets.init(top: 0, left: 10, bottom: 0, right: -10)
    
            button .addTarget(self, action:Selector(triggerToMethodName), forControlEvents: UIControlEvents.TouchUpInside)
            let rightItem:UIBarButtonItem = UIBarButtonItem()
            rightItem.customView = button
            self.navigationItem.rightBarButtonItem = rightItem
        }
    
    0 讨论(0)
  • 2020-12-08 07:21

    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
    }
    
    0 讨论(0)
  • 2020-12-08 07:22

    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.

    0 讨论(0)
  • 2020-12-08 07:23

    I gave up with fighting this bug, and came up with the following extension:

    import UIKit
    
    extension UIBarButtonItem {
    
        convenience init(buttonImage: UIImage?, target: Any?, action: Selector?) {
            let button = UIButton(type: .system)
            button.frame = CGRect(origin: CGPoint.zero, size: buttonImage != nil ? buttonImage!.size : CGSize.zero)
            button.setImage(buttonImage, for: .normal)
    
            if let action = action {
                button.addTarget(target, action: action, for: .touchUpInside)
            }
    
            self.init(customView: button)
        }
    
        public func updateButton(image: UIImage?) {
            if let button = self.customView as? UIButton {
                button.setImage(image, for: .normal)
    
                let size = image != nil ? image!.size : CGSize.zero
                let frame = button.frame
                button.frame = frame.insetBy(dx: ceil((frame.size.width - size.width) / 2), dy: ceil((frame.size.height - size.height) / 2))
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 07:32

    Found a crazy idea that works.

    func createCustomToolbar(items: [UIBarButtonItem]) -> UIToolbar
    {
        // no spacing between bar buttons
        let customToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: items.count*45, height: 44))
        customToolbar.items = items
        customToolbar.barStyle = UIBarStyle(rawValue: -1)!
        customToolbar.clearsContextBeforeDrawing = false
        customToolbar.backgroundColor = UIColor.clearColor()
        customToolbar.tintColor = UIColor.clearColor()
        customToolbar.translucent = true
        return customToolbar
    }
    
    
    let customToolbar = createCustomToolbar([item0,item1,item2,item3])
    navigationItem.rightBarButtonItems = [UIBarButtonItem(customView: customToolbar)]
    

    Tested on iOS7 and upper. Even this is written in swift the concept is clear.

    0 讨论(0)
  • 2020-12-08 07:34

    Might be a bit late for this answer however this can help the newest IOS+Swift combination (IOS 10 and Swift 3 in my case). Here I describe a general approach for how to move items right/left for rightBarButtonItems/leftBarButtonItems:

    The property you we have use here to move a barButtonItem is "imageEdgeInsets" . So, Here how to use this property -

    yourBarButtonItem.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right)

    These top, left, bottom, right are of type CGFloat and these are basically margin value that pushes your item from/to each other. For decreasing a space, we can just use minus (-) values like this " -10 ".

    So, for example if we want to use this for a group of leftBatButtonItems and say, if we want to move a item to the a bit right, then we can do this -

    ourBarButtonItem.imageEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, -15)
    

    I hope we get the general idea here and hope it helps :)

    0 讨论(0)
提交回复
热议问题