控制添加到工具栏的视图项的显示坐标

时间:2013-05-08 10:15:32

标签: iphone objective-c cocoa-touch uinavigationcontroller uinavigationbar

我希望能够精确控制我添加到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。想法?

enter image description here

1 个答案:

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

此外,如果您走这条路线,如果由于任何原因无法找到工具栏的视图,请编写将会正常失败的代码。我知道一些应用程序会走我的路线,而其他很多人甚至都不打扰,只是编写自己的代码来创建工具栏。