如何调整rightBarButtonItems中两个UIBarButtonItem之间的空间

时间:2014-03-30 08:21:02

标签: iphone xcode ios7 spacing rightbarbuttonitem

我使用以下代码将两个按钮添加到self.navigationItem.rightBarButtonItems,我认为在iOS7中,两个按钮之间的空间太宽,有没有办法减少这两个按钮之间的空间?

UIBarButtonItem *saveStyleButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"save.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(saveStyle)];

UIBarButtonItem *shareStyleButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(shareStyle)];

NSArray *arr= [[NSArray alloc] initWithObjects:shareStyleButton,saveStyleButton,nil];

self.navigationItem.rightBarButtonItems=arr;

欣赏任何提示或想法。

15 个答案:

答案 0 :(得分:48)

于2015年7月更新

更好的方法是使用storyboard(在Xcode 6.4中测试)。首先,添加一个UINavigationItem;其次,添加一个条形按钮项;第三,将视图添加到刚刚在步骤2中创建的条形按钮项;第四,在你刚刚拖入的视图中添加任意数量的按钮;最后,用鼠标和约束调整空间。

相关问题

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

How to add buttons to navigation controller visible after segueing?


旧答案(仅适用于小插图)

使用imageInsets属性:

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

对于三个或更多按钮,中间的按钮得到两个插图:

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

对于右侧按钮,请注意:项目数组中的FIRST按钮是正确的:

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

重要提示:拆分两个邻居之间的插图;如果将整个插图应用到一个边缘,很明显按钮在"空白"中重叠。空间 - 一个按钮可以获得所有的"间隙"触动。即使"分裂"像这样的调整,两边都是-40,水龙头肯定会出现错误按钮。使用这种技术时,-15或-20是最常考虑的。

通过应用此方法,按钮甚至可以在四个方向上移动。

答案 1 :(得分:5)

我的解决方案是将自定义视图用于右栏按钮。 创建等间距的水平stackview并添加任意数量的按钮作为子视图。

示例代码:

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
}

答案 2 :(得分:4)

如果你想在右上方有两个按钮,它们之间或右边没有空格,这对我有用。

let imgLeft = UIImage(named: "buttonLeft")?.imageWithRenderingMode(.AlwaysOriginal)
let bLeft = UIBarButtonItem(image: imgLeft, style: UIBarButtonItemStyle.Done, target: self, action: "action1:")
let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
space.width = -16.0

bLeft.imageInsets = UIEdgeInsetsMake(0, 0, 0, -25.0)


let imgRight = UIImage(named: "buttonRight")?.imageWithRenderingMode(.AlwaysOriginal)
let bRight = UIBarButtonItem(image: imgRight, style: UIBarButtonItemStyle.Done, target: self, action: "action2:")

bRight.imageInsets = UIEdgeInsetsMake(0, -25, 0, 0)


self.navigationItem.rightBarButtonItems = [space,bLeft,bRight ]

答案 3 :(得分:4)

我的情况是给logOut Button提供水平空间到右边缘。

 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
    }

答案 4 :(得分:4)

这个答案可能有点晚了但是这可以帮助最新的IOS + Swift组合(在我的情况下是IOS 10和Swift 3)。在这里,我描述了如何为rightBarButtonItems / leftBarButtonItems向右/向左移动项目的一般方法:

我们在这里用来移动barButtonItem的属性是" imageEdgeInsets" 。那么,这里有如何使用这个属性 -

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

  

这些顶部,左侧,底部,右侧属于CGFloat类型,这些基本上是边缘值,可以将您的项目相互推送。   为了减少空间,我们可以使用像这样的减号( - )和#34; -10"。

所以,例如,如果我们想将它用于一组leftBatButtonItems,并且如果我们想要将项目移动到正确的位置,那么我们可以这样做 -

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

我希望我们在这里得到一般的想法并希望它有所帮助:)

答案 5 :(得分:2)

创建一个类型灵活或固定空间的UIBarButtonItem。设置宽度并将其添加到barbuttonitems数组中。尝试使用负宽度,看看是否有效。

或者,您可以调整图像。系统按钮我认为有一个固定的尺寸,可能包括一些透明的部分,所以即使打包在一起仍然看似间隔。

答案 6 :(得分:2)

没有任何代码。我只是在故事板中需要间距的按钮之间放置另一个UIBarButtonItem。该按钮只是间距的占位符,UIBarButton应该将UIView作为UIBarButtonItem的子视图。为您的间距调整视图的宽度。请参见屏幕截图。

enter image description here

enter image description here

enter image description here

答案 7 :(得分:2)

第一:

对于UIBarButtonItem,您必须使用构造函数init(customView: UIView)

第二:

使用fixedSpace设置按钮之间的间距

示例:

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 = WIDTH

self.navigationItem.rightBarButtonItems = [firstButtonItem, space, secondButtonItem]

答案 8 :(得分:2)

只需一行代码即可缩小导航栏中按钮之间的间距:

UIStackView.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).spacing = -10

在将按钮添加到导航栏之前,您必须将此行放在代码中。

答案 9 :(得分:1)

要在代码中完成此操作而不添加额外的容器视图,请使用系统项类型设置为UIBarButtonItem的{​​{1}}。然后将固定空间的宽度设置为FixedSpace,并将其放在两个按钮之间。

答案 10 :(得分:1)

另一个答案: 它适用于ios 9-12。 您应该在函数 viewDidAppear(_ animation:Bool) viewDidLayoutSubviews()中调用 fixNavigationItemsMargin(margin:) fixNavigationItemsMargin(margin:)将修改UINavigationController堆栈。

您可以在BaseNavigationController中调用 fixNavigationItemsMargin(margin:),执行常见的工作。然后在UIViewController中调用 fixNavigationItemsMargin(margin:)进行精确的布局。

import { Line, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins

export default {
  extends: Line,
  mixins: [reactiveProp],
  props: ['options', 'chartData'],
  mounted () {
    // this.chartData is created in the mixin.
    // If you want to pass options please create a local options object
    this.renderChart(this.chartData, this.options)
  }
}

答案 11 :(得分:1)

雨燕5

在您的AppDelegate中添加以下代码:

let stackViewAppearance = UIStackView.appearance(whenContainedInInstancesOf: [UINavigationBar.self])
stackViewAppearance.spacing = -10

答案 12 :(得分:0)

找到一个有效的疯狂想法。

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

在iOS7和鞋面上测试过。即使这是写得很快,这个概念也很明确。

答案 13 :(得分:0)

我放弃了对抗这个bug,并提出了以下扩展:

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

答案 14 :(得分:0)

快速5

如果要在两个“条形按钮”项目之间添加空间,然后在其间添加一个灵活的空间,则随着该灵活空间的扩展而占用了大部分工具栏,这两个按钮将被推到左右边缘。

例如:

BookViewController