在导航栏中放置一个基于自定义视图的 UIBarButtonItem 而没有默认的水平填充

Posted

技术标签:

【中文标题】在导航栏中放置一个基于自定义视图的 UIBarButtonItem 而没有默认的水平填充【英文标题】:Placing a custom view based UIBarButtonItem in the navigation bar without default horizontal padding 【发布时间】:2011-01-17 16:13:41 【问题描述】:

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

我正在自定义左右导航栏按钮(我已经放弃尝试设置自己的backButtonItem,所以我只使用leftBarButtonItem)。

在任何一种情况下(左或右),按下这些自定义按钮都表明 Apple 似乎在 leftBarButtonItem 的左侧和 rightBarButtonItem 的右侧保留了一些填充;无论我将 UIButton 的自定义背景和图像属性设置多宽,我都将其放置在左/右栏按钮项内作为其自定义视图。

由于 UIBarButtonItems 没有我可以访问的“框架”,我不能像普通 UIViews 那样将它们定位在它们的超级视图中。

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

图片见:https://skitch.com/starbaseweb/rj2e5/ios-simulator

作为参考,这是我创建自定义 UIBarButtonItem 的方式(在本例中,它是右键):

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

【问题讨论】:

+1:我遇到了这个问题并尝试了很多东西......包括插图,只是在 x 位置的 -10 处制作图像等等......没有运气,所以我只保留了小填充并重新制作图像以使其更合适。祝你好运。 【参考方案1】:

55如上所述,我采用的解决方案是基于对一个不同但非常相关的问题的答案:How to adjust UIToolBar left and right padding。 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 早期种子的人应该测试一下这种无意的东西,比如这个 hack,是否真的会在 iOS6 之后继续为你工作。

【讨论】:

在不改变顺序的情况下也适用于 rightBarButtonItems(您可能想颠倒 backButtonItem 和negativeSpace 的顺序,但事实并非如此) 特别是我遇到了一个难题,即导航控制器在 iPad 视图控制器中显示为子级。我的自定义后退按钮一直被推到左侧,离开导航栏,但在左侧添加一个 33pt 的间隔为我修复了它:) 不错的技巧。然而,IMO 证明了 iOS 编程正变得越来越复杂。 @idStar 这似乎在 iOS 7 Beta 2 中仍然有效。有没有办法删除垂直填充?我无法调整negativeSpacer的高度。 @michaellindahl 我没有任何调整垂直间距的经验。你比我发布 iOS6.1 更成功。鉴于 iOS7 NDA,我将很快链接到有关该主题的 Apple 论坛帖子。【参考方案2】:

我已经尝试过了,它确实有效:

1) 创建一个自定义 UIToolbar 子类,它在 -drawRect: 中什么都不做,并且不是不透明的,并且具有 backgroundColor = [UIColor clearColor]。

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

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

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

【讨论】:

另一个技巧是,您可以简单地使导航栏比视口更宽,这样右边的填充就被剪掉了,您的按钮就会出现在正确的位置!这仅在您直接管理 UINavigationBar 时才有效,即不通过导航控制器。 谢谢伊万。我通过解决方法跳过了这个问题,但我会尝试回到这个发布版本来确认您建议的解决方法,以便我可以将其标记为已接受的答案。 我确实找到了一个更干净的实现,可能在 iOS5 上。在这里查看答案:***.com/questions/6021138/… 我测试了这个解决方案并且它有效。两行代码,侵入性最小。

以上是关于在导航栏中放置一个基于自定义视图的 UIBarButtonItem 而没有默认的水平填充的主要内容,如果未能解决你的问题,请参考以下文章

wordpress中的自定义导航栏。如何正确设置样式?

如何摆脱自定义底部导航栏颤动周围的空白?

在自定义导航栏中设置条形按钮项目颜色

在 Bootstrap 导航栏中放置更多项目

弹出视图时不恢复自定义导航栏背景

在 UITableViewCell 的附件视图中使用自定义按钮的问题