0

我想精确控制添加到 UINavigationController 工具栏的自定义视图。更具体地说..我想在我的工具栏中的项目上显示一个UILable

toolbarItems最初设置了一些UIBarButtonItems. 我想要达到的效果是以编程方式扩展工具栏的高度,然后UILabel在其余按钮的顶部显示一个。这就是我目前拥有的:

-(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 领域,这是Apple 不会容忍的。想法?

在此处输入图像描述

4

1 回答 1

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;
}

此外,如果你走那条路,编写代码,如果由于任何原因无法找到工具栏的视图,则会优雅地失败。我知道一些应用程序符合我的要求,而许多其他应用程序甚至都不费心,只需编写自己的代码来创建工具栏。

于 2013-05-08T11:09:52.103 回答