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 的垂直位置不正确