navigationItem setRightBarButtonItems 间距太宽

Posted

技术标签:

【中文标题】navigationItem setRightBarButtonItems 间距太宽【英文标题】:navigationItem setRightBarButtonItems spacing too wide 【发布时间】:2014-11-24 06:18:51 【问题描述】:

我正在尝试减少这两个条形按钮项目之间的距离。

我正在使用

navigationItem setRightBarButtonItems

设置两个按钮项,但它们相距太远。

我尝试添加负空间,我尝试在其后添加间隔,固定空间,灵活空间。在文档中看不到任何内容说您无法更改间距,但我找不到如何更改。

提前感谢您的帮助。

回答后编辑:

Siu Chung Chan 的回答完全正确,但由于我一开始不太明白,我想我会分享让我意识到他完全正确的代码。

如果您将所有内容放在一个块中,这就是他的(非常正确)答案的样子:

UIView *filterBtnView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
UIButton *filterBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
[filterBtn addTarget:self action:@selector(someMethod) forControlEvents:UIControlEventTouchUpInside];
[filterBtn setBackgroundImage:[UIImage imageNamed:@“someicon”] forState:UIControlStateNormal];
[filterBtnView addSubview:filterBtn];
UIBarButtonItem *btnFilter = [[UIBarButtonItem alloc] initWithCustomView:filterBtnView];

UIView *selectBtnView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
UIButton *selectBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
[selectBtn setBackgroundImage:[UIImage imageNamed:@“someothericon”] forState:UIControlStateNormal];
[selectBtn addTarget:self action:@selector(someOtherMethod:) forControlEvents:UIControlEventTouchUpInside];
[selectBtnView addSubview:selectBtn];
UIBarButtonItem *btnSelect = [[UIBarButtonItem alloc] initWithCustomView:selectBtnView];

[self.navigationItem setRightBarButtonItems:@[btnFilter, btnSelect] animated:YES];

对我来说,它的美妙之处在于它让我们可以窥见 Apple 实际设置的某些视图是如何偏向于他们只想如何使用它们的。所以如果你想做高度定制的 UI,你必须做很多 UIView 操作来绕过他们(也许)意想不到的障碍。

故事的寓意:如果视图不适合您,请尝试从 UIView 级别重新创建视图,然后将其添加到您要在其中显示它的视图中。

再次感谢陈小中!

【问题讨论】:

查看图片尺寸宽度是否很大。 谢谢。按钮的大小是我放入按钮的图像的大小。所以决定间距的是别的东西。 【参考方案1】:

我以前做过。

您必须为按钮创建自己的 UIView。 导致默认的 uibarbuttonitem 左右两侧有一些填充。

ViewIconBtn* searchViewIconBtn = [[ViewIconBtn alloc] initWithImage:[UIImage imageNamed:@"searchIcon.png"]];
[searchViewIconBtn.btn addTarget:self action:@selector(toSearch) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem* btnSearch = [[UIBarButtonItem alloc] initWithCustomView:searchViewIconBtn];

UIBarButtonItem *space15 = [NegativeSpacer negativeSpacerWithWidth:15];
    [self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:space15,btnWishList,btnPost,btnSearch, nil]];

btnWishList,btnPost,btnSearch 都是 ViewIconBtn 类。 在我的项目中,我在右侧创建了 3 个导航按钮。

UIBarButtonItem space15 用于调整边界和最右边栏按钮之间的填充。

【讨论】:

好的。这对我来说很有意义。 ViewIconBtn 是 UIButton 的子类吗?或者是您添加 UIButton 元素的 UIView 的直接子类? 是的,我让 ViewIconBtn 是一个带有按钮的 uiview 有趣。稍后我会试一试。感谢您的快速回复!我很感激! 是的!那太完美了!谢谢!对于其他“非常”定制的视图也是一种很好的技术。再次感谢!【参考方案2】:

您提供的解决方案效果很好。如果您想简化它,您实际上可以直接使用UIButton 作为自定义视图,而不将其嵌入UIView

我发现我的新按钮之间的距离实际上比标准的苹果距离小一些,所以我使用了您的示例,将 UIButton 嵌入到 UIView 中,但将 UIView 的框架更改为稍微更大。

UIView *filterBtnView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 45, 35)];

【讨论】:

【参考方案3】:
- (void)addTwoRightBarButtonItems 

    UIButton *reloadBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    reloadBtn.frame = CGRectMake(0.0, 0.0, 45.0, 44.0);
    [reloadBtn setImage:[UIImage imageNamed:@"reload_icon"] forState:UIControlStateNormal];men
    reloadBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 20, 0, 0);
   // reloadBtn.backgroundColor = [UIColor redColor];

    UIButton *menuBtn = [UIButton buttonWithType:UIButtonTypeSystem];
    menuBtn.frame = CGRectMake(45.0, 0.0, 45.0, 44.0);
    UIImage *image = [[UIImage imageNamed:@"menu_icon"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    [menuBtn setImage:image forState:UIControlStateNormal];
    //menuBtn.backgroundColor = [UIColor greenColor];

    UILabel *badgeLbl = [[UILabel alloc]initWithFrame:CGRectMake(25, 8, 18, 18)];
    badgeLbl.layer.cornerRadius = 9;
    [badgeLbl.layer setMasksToBounds:YES];
    badgeLbl.backgroundColor = [UIColor colorWithRed:255.0/255.0 green:197.0/255.0 blue:0.0 alpha:1.0];
    badgeLbl.textColor = [UIColor colorWithRed:136.0/255.0 green:94.0/255.0 blue:16.0/255.0 alpha:1.0];
    badgeLbl.font = [UIFont fontWithName:@"Lato-Bold" size:9.f];
    badgeLbl.textAlignment = NSTextAlignmentCenter;
    badgeLbl.hidden = YES;
    [menuBtn addSubview:_lblBadge];

    UIBarButtonItem *offset = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    offset.width = -10.0;

    UIView *v = [[UIView alloc]initWithFrame:(CGRect).size.width = 90.0,.size.height = 44.0];
    [v addSubview:reloadBtn];
    [v addSubview:menuBtn];

    UIBarButtonItem *reloadItem = [[UIBarButtonItem alloc] initWithCustomView:v];

    [self.navigationItem setRightBarButtonItems:@[offset,reloadItem]]; //

【讨论】:

以上是关于navigationItem setRightBarButtonItems 间距太宽的主要内容,如果未能解决你的问题,请参考以下文章

当我向 navigationItem 添加更多按钮时,如何使我的 navigationItem.titleView 居中?

更改 NavigationItem 标题

在navigationItem中居中titleView

如何重新加载 NavigationItem 标题

navigationItem和navigationBar相关性

在 Monotouch 中更改“返回”NavigationItem 文本?