我使用以下代码将两个按钮添加到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;
欣赏任何提示或想法。
答案 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的子视图。为您的间距调整视图的宽度。请参见屏幕截图。
答案 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)
在您的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