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

如何将自定义左侧和右侧UINavigationBar项左侧和右侧的水平填充删除? 似乎默认情况下,iOS会设置约10个填充点。

我正在自定义左侧和右侧导航栏button(我已经放弃了试图设置自己的backButtonItem,所以我只是使用leftBarButtonItem)。

在这两种情况下(左或右),按这些自定义button表示苹果似乎保留左边的左边的BarButtonItem,右边的右边的BarButtonItem; 不pipe宽度如何,我把UIButton的自定义背景和图像属性放置在左/右栏button项目中作为其自定义视图。

由于UIBarButtonItems没有“框架”,我可以访问,我不能像他们的超级视图,像我可以正常的UIViews。

任何build议如何删除这个默认的填充? 看到附加的屏幕截图看到我试图减less到零宽度的位。 在屏幕截图中,加号图标显示向右移动,因为我给它插入; 但突出显示的背景图像,也可能是使用该插图,在右侧被截断)。

请参阅https://skitch.com/starbaseweb/rj2e5/ios-simulator

作为参考,这里是我如何创build我的自定义UIBarButtonItem(在这种情况下,它是正确的button):

- (UIBarButtonItem *)customAddButtonItemWithTarget:(id)target action:(SEL)action { UIButton *customButtonView = [UIButton buttonWithType:UIButtonTypeCustom]; customButtonView.frame = CGRectMake(0.0f, 0.0f, 45.0f, 44.0f); [customButtonView setBackgroundImage: [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Normal.png"] forState:UIControlStateNormal]; [customButtonView setBackgroundImage: [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Highlighted.png"] forState:UIControlStateHighlighted]; [customButtonView setImage: [UIImage imageNamed:@"bgNavBarButton-Add-Normal.png"] forState:UIControlStateNormal]; [customButtonView setImage: [UIImage imageNamed:@"bgNavBarButton-Add-Highlighted.png"] forState:UIControlStateHighlighted]; [customButtonView addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *customButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:customButtonView] autorelease]; [customButtonView setImageEdgeInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f)]; //customButtonItem.imageInsets = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f); return customButtonItem; } 

如上所述,我所使用的解决scheme是基于这个答案来解决一个不同但非常相关的问题: 如何调整UIToolBar的左右填充 。 这也是由(并取决于)iOS5,它允许您设置左侧或右侧的多个button,而不是一个便利。

下面是一个删除自定义左键项左侧的填充的示例:

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

与此同时,导航栏中左侧栏button项的左侧填充已消失!

注意 :这在iOS5和iOS6中适用于我。 鉴于iOS7和公开的演示有很大的不同,那些拥有iOS7早期种子的人应该testing一下,像这样的无意之事,实际上是否会继续在iOS6之外为你工作。

我已经试过这个,它的工作原理:

1)创build一个自定义的UIToolbar子类,它在-drawRect中不做任何事情,并且不是不透明的,并且具有backgroundColor = [UIColor clearColor]。

2)创build一个工具栏作为自定义视图的自定义UIBarButtonItem。

3)将您的button添加到自定义工具栏。

4)在您的自定义工具栏覆盖-layoutSubviews并做你自己的间距。