iOS 7 的 UIToolbar 中 UIBarButtonItems 的垂直位置不正确

Posted

技术标签:

【中文标题】iOS 7 的 UIToolbar 中 UIBarButtonItems 的垂直位置不正确【英文标题】:Incorrect vertical position for UIBarButtonItems in UIToolbar for iOS 7 【发布时间】:2013-10-15 03:38:32 【问题描述】:

我有这段代码用于 iPad 应用程序,它适用于 ios 7 以下的任何 iOS

UIToolbar* tools = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 75, 44)];

NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:2];

UIBarButtonItem *composeButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:self action:@selector(toggleDelete:)];

[buttons addObject:composeButton];

UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];

fixedSpace.width = 5;

[buttons addObject:fixedSpace];

UIBarButtonItem* bi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(touchMe:)];

[buttons addObject:bi];

[tools setItems:buttons animated:NO];

tools.barStyle = -1;

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools];

[bi release];
[fixedSpace release];
[composeButton release];
[buttons release];    
[tools release];

这个pre iOS 7的结果是:

在 iOS 7 上运行相同的代码会产生以下结果:

由于某种原因,按钮在 iOS 7 中被移到了工具栏的底部。

现在,我可以使用 UIBarItem imageInset 属性重新定位它们,但这似乎有点骇人听闻,因为那时我需要检查 iOS 版本,并且只有在 iPad 运行 iOS 7+ 时才执行 imageInset。我的问题是我是否遗漏了与 UIToolbar 相关的 iOS 7 特有的任何内容?我查看了 iOS 7 UI 转换指南,但找不到任何特定于此问题的内容。

【问题讨论】:

【参考方案1】:

由于我没有得到任何其他答案并找到适合我的解决方法,我将为遇到相同问题的其他人回答这个问题。如果您的目标是 iOS 5.0 及更高版本,有一种方便的方法可以将多个项目添加到右侧栏按钮。这是修复:

[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:deleteButton, bi, nil]];

【讨论】:

谢谢,但此更改并没有解决我的问题。进行此更改后,我仍然有相同的错误垂直偏移。编辑:但是,当我将您的答案与指定每个 Bond007 答案的宽度结合起来时,一切看起来都不错。 @dacoinminster 感谢您添加信息。我在这个问题上花了相当多的时间,但似乎有不同的解决方案。【参考方案2】:

在设计器(故事板)中检查您的工具栏。确保为工具栏上的所有按钮指定宽度。我有类似的问题,在我为故事板工具栏中的每个按钮指定宽度后,它已经消失了,现在按钮在 iOS 7 的工具栏中正确定位。

【讨论】:

我正在以编程方式添加工具栏。 我也有这个案例,工具栏上有系统项目。我已经通过将工具栏框架设置为 CGRectZero 然后在下一行设置工具栏框架来更正父表格视图单元格的 layoutSubviews 方法中的框架来解决它。 我将此答案与 bizsytes 的自我答案结合起来,这两个答案共同解决了我的问题。 我有一个类似的问题,栏按钮项目将在 iOS 7 中正确显示,但在 iOS 6 中不正确。设置栏按钮项目的宽度解决了该问题,现在按钮正确对齐两个 iOS 系统上的纵向和横向模式。【参考方案3】:

使用 CGRectZero 创建 UIToolbar 并在 setItems 之后设置它的框架:解决了我在 iOS 7 上的问题。

UIToolbar *tools = [[UIToolbar alloc] initWithFrame:CGRectZero];
//Create array with items
[tools setItems:buttonsArray animated:NO];
//Setting frame at this moment fixes the issue    
tools.frame = toolbarFrame;

【讨论】:

是的,这里也一样。谢谢!【参考方案4】:

我只有 iOS7 有这个问题。 iOS8 总体上可以完美运行。解决办法是toolbar的高度是44.0,我设置了delegate UIBarPositioning,item的位置在top:

- (UIBarPosition) positionForBar: (id<UIBarPositioning>) bar 
    return UIBarPositionTop;

【讨论】:

以上是关于iOS 7 的 UIToolbar 中 UIBarButtonItems 的垂直位置不正确的主要内容,如果未能解决你的问题,请参考以下文章

UIBarButtonItem 在 iOS 7 的 UIToolbar 上不显示

iOS 7 的 UIToolbar 中 UIBarButtonItems 的垂直位置不正确

在 iOS 7 中移除 UIToolbar 细线

iOS 7 UIToolBar 颜色

UIToolBar tintColor 不适用于 iOS 7

如何在 iOS 7 中向 UIToolbar 添加更大的按钮项?