iOS 7 UIBarButtonItem 荒谬的间距问题
Posted
技术标签:
【中文标题】iOS 7 UIBarButtonItem 荒谬的间距问题【英文标题】:iOS 7 UIBarButtonItem ridiculous spacing issue 【发布时间】:2013-10-10 21:24:47 【问题描述】:我遇到了一个到目前为止我找不到解决方案的问题。我正在向我的应用程序添加一个新功能,并希望在我的 UINavigationBar 的左侧添加第二个 UIBarButtonItem。出于某种原因,ios 7 将其视为 button1、grandCanyon、button2。我找不到任何方法来消除这两个按钮之间荒谬的间距,这也导致我的标题不对齐。谁能帮忙!?有解决办法吗!?
代码:
UIBarButtonItem *firstButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"firstButton"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings)];
UIBarButtonItem *secondButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"secondButton"] style:UIBarButtonItemStylePlain target:self action:@selector(showAttachments)];
[self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:firstButton, secondButton, nil]];
【问题讨论】:
显示设置按钮的代码。 将代码放入您的问题中,以便人们阅读。 糟糕,完成。没有意识到我可以编辑帖子,抱歉。 【参考方案1】:认为我已经设法使用如下所示的自定义视图解决了问题,它并不完美(例如,选择使按钮变暗而不是变亮)但我明天会尝试解决这个问题。很高兴我的头痛结束了!感谢您的帮助,它让我找到了一些我没有尝试过的新方法。
UIImage *firstButtonImage = [UIImage imageNamed:@"firstButton"];
firstButtonImage = [firstButtonImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIButton *firstButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
[firstButton setImage:firstButtonImage forState:UIControlStateNormal];
[firstButton addTarget:self action:@selector(firstButtonPressed) forControlEvents:UIControlEventTouchUpInside];
UIImage *secondButtonImage = [UIImage imageNamed:@"secondButton"];
secondButtonImage = [secondButtonImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIButton *secondButton = [[UIButton alloc] initWithFrame:CGRectMake(45, 0, 35, 35)];
[secondButton setImage:secondButtonImage forState:UIControlStateNormal];
[secondButton addTarget:self action:@selector(secondButtonPressed) forControlEvents:UIControlEventTouchUpInside];
UIView *leftBarItemsView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 35)];
[leftBarItemsView addSubview:firstButton];
[leftBarItemsView addSubview:secondButton];
UIBarButtonItem *leftBarItem = [[UIBarButtonItem alloc] initWithCustomView:leftBarItemsView];
[self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObject:leftBarItem]];
【讨论】:
非常感谢。我今天遇到了同样的问题并使用您的答案解决了它。 似乎在 iOS 7 中它也在 UIToolbar 中展开 UIBarButtonItems。我已将我的设置为按钮,标签,按钮,标签,灵活空间,它显示为按钮,标签,灵活,按钮,标签【参考方案2】:可能有更好的方法,但为了纠正 iOS 7 上条形按钮项目的间距问题,我将 UINavigationBar 子类化并覆盖了 layoutSubviews
方法。在那里,您可以将每个条形按钮项移动到任何您想要的位置。
举个例子:
- (void)layoutSubviews
[super layoutSubviews];
// If iOS 7, fix the bar button positions
BOOL isIOS7 = [[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending;
if (isIOS7)
for (UIBarButtonItem *item in self.topItem.leftBarButtonItems)
// Reposition the customView property
for (UIBarButtonItem *item in self.topItem.rightBarButtonItems)
// Reposition the customView property
实际上,当我查看我的代码时,我正在使用带有自定义视图的 UIBarButtonItems。所以我能够移动自定义视图位置。
如果您只是将 UIBarButtonItems 与如下图像一起使用,您可能需要遍历 UINavigationBar 的子视图来移动它们:
- (void)layoutSubviews
[super layoutSubviews];
// If iOS 7, fix the bar button positions
BOOL isIOS7 = [[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending;
if (isIOS7)
for (UIView *subview in self.subviews)
// Reposition as needed
【讨论】:
你有你在drawRect中改变了什么的例子吗:,不知道我会怎么做。 已更新。你问的也是好事,我记错了,它是 layoutSubviews 方法,而不是 drawRect。 我刚刚再次更新了我的答案,让我知道这是否适合你 我不太擅长这个:\ 我将如何使用子类 UINavigationBar?如果我尝试将其分配给导航控制器,它会告诉我这是一个只读属性。 我注意到,如果我使用标准系统项目,间距很好,但是当我使用自定义图像时,间距会变得过大。可能与 UIBarButtonItem 处理 UIImage 的方式有关,还是与 UIImage 有关?以上是关于iOS 7 UIBarButtonItem 荒谬的间距问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UINavigationBar [iOS 7] 中编辑左、右 UIBarButtonItem 的空白
UIBarButtonItem在用作左侧或右侧导航栏项目时,自定义视图未在iOS 7上正确对齐
工具栏中的 UIBarButtonItem 可以在 iOS 7 中具有背景图像吗?
在 iOS 7 上带有 UIBarButtonItem 外观的 EXC_BAD_ACCESS