Iphone 在导航栏中放置基于自定义视图的UIBarButtonim,而不使用默认的水平填充

Iphone 在导航栏中放置基于自定义视图的UIBarButtonim,而不使用默认的水平填充,iphone,ios,uinavigationbar,uibarbuttonitem,uinavigationitem,Iphone,Ios,Uinavigationbar,Uibarbuttonitem,Uinavigationitem,如何删除自定义左侧和右侧UINavigationBar项目左侧和右侧的水平填充?iOS默认设置了大约10个填充点 我正在自定义左侧和右侧导航栏按钮(我已经放弃设置自己的BackButtonim,所以我只使用LeftBarButtonim) 在任何一种情况下(左或右),按下这些自定义按钮表示苹果似乎保留了左按钮左边和右按钮右边的一些填充;无论UIButton的自定义背景和图像属性有多宽,我都会将其作为自定义视图放置在左/右栏按钮项中 因为UIBarButtonims没有我可以访问的“框架”,所以我

如何删除自定义左侧和右侧UINavigationBar项目左侧和右侧的水平填充?iOS默认设置了大约10个填充点

我正在自定义左侧和右侧导航栏按钮(我已经放弃设置自己的BackButtonim,所以我只使用LeftBarButtonim)

在任何一种情况下(左或右),按下这些自定义按钮表示苹果似乎保留了左按钮左边和右按钮右边的一些填充;无论UIButton的自定义背景和图像属性有多宽,我都会将其作为自定义视图放置在左/右栏按钮项中

因为UIBarButtonims没有我可以访问的“框架”,所以我不能像在普通UIView中一样将它们放置在superview中

有没有关于如何删除此默认填充的建议?请参阅附加的屏幕截图,以查看我试图缩小到零宽度的位。在屏幕截图中,加号图标似乎向右移动,因为我给了它一个插图;但高亮显示的背景图像(可能也使用了该插图)在右侧被剪裁)

如图所示:

作为参考,以下是我如何创建自定义UIBarButtonItem(在本例中,它是右键):


我已经尝试过这个方法,效果很好:

1) 创建一个自定义UIToolbar子类,该子类在-drawRect:中不起任何作用,并且不是不透明的,并且具有backgroundColor=[UIColor clearColor]

2) 使用工具栏作为自定义视图创建自定义UIBarButtonim

3) 将按钮添加到自定义工具栏


4) 在自定义工具栏覆盖-布局子视图中,使用您自己的间距。

55如上所述,我使用的解决方案基于对一个不同但非常相关的问题的回答:。iOS5也提供了便利(并依赖于iOS5),它允许您在左侧或右侧设置多个按钮,而不仅仅是一个按钮

以下是移除自定义左按钮项左侧填充的示例:

UIBarButtonItem *backButtonItem // Assume this exists, filled with our custom view

// Create a negative spacer to go to the left of our custom back button, 
// and pull it right to the edge:
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
    target:nil action:nil];
negativeSpacer.width = -5; 
// Note: We use 5 above b/c that's how many pixels of padding iOS seems to add

// Add the two buttons together on the left:
self.navigationItem.leftBarButtonItems = [NSArray 
    arrayWithObjects:negativeSpacer, backButtonItem, nil];
这样,导航栏中左栏按钮项的左侧填充就消失了


注意:这对我在iOS5和iOS6中起到了作用。考虑到iOS7与公开的演示有很大的不同,那些拥有iOS7早期种子的人应该测试一下,在iOS6之后,像这次黑客攻击这样的无意行为是否会继续对你有效。

+1:我遇到了这个问题,并尝试了很多方法……包括插入,只是把图像放在-10的x位置等等…运气不好,所以我只是保留了小的填充,然后重新编辑图像使其更合适。祝你好运。另一个诀窍是,你可以简单地使导航栏比视口宽一些,这样正确的填充就会被剪掉,你的按钮就会出现在正确的位置!这仅在您直接管理UINavigationBar(即不通过导航控制器)时有效。谢谢Evadne。我用一个变通方法解决了这个问题,但我会尝试回到这个发布后的版本,以确认建议的变通方法,这样我就可以将它标记为可接受的答案。我确实找到了一个更干净的实现,可以使用iOS5。请看这里的答案:我测试了这个解决方案,它成功了。两行代码,侵入性最低。在不改变顺序的情况下也适用于rightBarButtonItems(你可能会尝试反转backButtonItem和negativeSpace的顺序,但事实并非如此)。特别是,我遇到了一个难题,导航控制器在iPad视图控制器中作为孩子呈现。我的自定义后退按钮一直被推到左侧,离开导航栏,但在左侧添加了一个33磅的间隔棒,为我解决了这个问题:)很好的破解。然而,在我看来,iOS编程变得多么复杂,这是一个很好的证明。@idStar这似乎仍然适用于iOS 7 Beta 2。有没有办法去掉垂直衬垫?我不能调整负片的高度。@michaellindahl我没有任何调整垂直间距的经验。你比我发布iOS6.1更成功。考虑到iOS7的保密协议,我将很快链接到苹果论坛关于这个主题的帖子。
UIBarButtonItem *backButtonItem // Assume this exists, filled with our custom view

// Create a negative spacer to go to the left of our custom back button, 
// and pull it right to the edge:
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
    target:nil action:nil];
negativeSpacer.width = -5; 
// Note: We use 5 above b/c that's how many pixels of padding iOS seems to add

// Add the two buttons together on the left:
self.navigationItem.leftBarButtonItems = [NSArray 
    arrayWithObjects:negativeSpacer, backButtonItem, nil];