我希望能够精确控制我添加到UINavigationController工具栏的自定义视图。更具体地说..我想在工具栏中显示项目的UILable ontop 。
我最初设置的toolbarItems
有一些UIBarButtonItems
。我试图实现的效果是以编程方式扩展工具栏的高度,然后在其余按钮上显示UILabel
on ..这就是我目前所拥有的:
-(void)expandToolBar:(NSString *)title {
UIToolbar* toolBar =self.navigationController.toolbar;
CGRect toolbarFrame = toolBar.frame;
[UIView animateWithDuration:0.25f delay:0
options:UIViewAnimationOptionLayoutSubviews animations:^{
// expand toolbar frame vertically
[toolBar setFrame:
CGRectMake(toolbarFrame.origin.x,
toolbarFrame.origin.y-15,
toolbarFrame.size.width,
toolbarFrame.size.height + 15)];
} completion:^(BOOL finished){
[UIView animateWithDuration:0.50f animations:^{
// some code here to move the existing toolbar items lower
// ie to make space for the label
UILabel* label = [[UILabel alloc] initWithFrame:labelFrame];
[label setBackgroundColor:[UIColor clearColor]];
label.text = title;
UIBarButtonItem *labelItem = [[UIBarButtonItem alloc]
initWithCustomView:label];
// add label to toolbar
NSMutableArray *newItems = [self.toolbarItems mutableCopy];
[newItems addObject:labelItem];
self.toolbarItems = newItems;
}];
}];
}
这样做的结果是所有现有的按钮都被压扁了,标签取代了它们。问题在于,如果我试图变得有点太有创意并开始手动搞乱工具栏的子视图,我开始徘徊在未记录的API领域,something Apple不会tolerate。想法?
答案 0 :(得分:1)
你的实际问题是什么?如果您正在做的是合法?我使用一些类似的技巧从UIBarButtonItem获取从它表示的视图,它从来都不是问题。
例如,我使用以下代码段没有任何问题。从技术上讲,这并不是每次都使用私有API,而是依赖于未记录的视图结构,这里也是类名的一部分,所以真的应该知道你在做什么。还请提交UIBarButtonItem搞砸的雷达,并错过一个明显的标志来进入实际视图。
static UIView *PSToolbarViewForBarButtonItem(UIToolbar *toolbar, UIBarButtonItem *barButtonItem) {
UIView *barButtonView = nil;
for (UIControl *subview in toolbar.subviews) {
if ([NSStringFromClass([subview class]) hasPrefix:@"UIToolbarB"] && [subview isKindOfClass:[UIControl class]]) {
for (UIBarButtonItem *aBarButtonItem in [subview allTargets]) {
if (barButtonItem == aBarButtonItem) { barButtonView = subview; break; }
}
}
}
return barButtonView;
}
此外,如果您走这条路线,如果由于任何原因无法找到工具栏的视图,请编写将会正常失败的代码。我知道一些应用程序会走我的路线,而其他很多人甚至都不打扰,只是编写自己的代码来创建工具栏。