导航栏右侧按钮间距过宽

8

enter image description here

我想要减小这两个导航栏按钮之间的距离。

我正在使用:

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

对我而言,这个美妙之处在于它让我们一窥苹果是如何设置一些视图,以便只能按照他们的意愿使用。因此,如果您想要高度自定义UI,则必须进行大量的UIView操作,以绕过它们(也许是)无意中设定的障碍。
故事的寓意:如果一个视图不能正确对齐,请尝试从UIView级别重新创建该视图,然后将其添加到您要显示它的视图中。
再次感谢Siu Chung Chan!

2
检查图像尺寸的宽度,看看是否非常大。 - gabbler
谢谢。按钮的大小是我放在按钮中的图像的大小。因此,还有其他东西决定间距。 - addzo
3个回答

5

我之前做过这个。

你需要为按钮创建自己的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类。在我的项目中,我在右侧创建了三个导航按钮。

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


好的。这对我来说有点意义。ViewIconBtn是UIButton的子类吗?还是它是UIView的直接子类,你向其中添加了UIButton元素? - addzo
是的,我创建了ViewIconBtn,它是一个带有按钮的UIView。 - Siu Chung Chan
有趣。稍后我会试一下。感谢快速回复!我很感激! - addzo
太好了!那真是完美!谢谢!这也是其他“非常”定制视图的一个好技巧。再次感谢! - addzo

0
你提供的解决方案非常好。如果你想简化它,实际上可以直接使用UIButton作为自定义视图,而不必将其嵌入到UIView中。
我发现我的新按钮之间的距离实际上比标准苹果距离小一点,所以我使用了你的例子,将UIButton嵌入到UIView中,但是改变了UIView的框架大小。
UIView *filterBtnView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 45, 35)];

0
- (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]]; //
}

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接