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 居中?