Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I want to have precise control over the custom view I add to my UINavigationController toolbar. More specifically.. i want to display a UILable ontop of the items in my toolbar.

I have a toolbarItems initially set up with some UIBarButtonItems. The effect I'm trying to achieve is programmatically expand the height of the toolbar, and then display a UILabel ontop of the rest of the buttons.. this is what I currently have:

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

the result of this is that all the existing buttons get squashed, and the label takes their place. The problem is that If I try to get a little too creative and start manually messing with the subviews of the toolbar, I start wandering into undocumented API land, something Apple won't tolerate. Ideas?

enter image description here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
178 views
Welcome To Ask or Share your Answers For Others

1 Answer

What's your actual question? If what you're doing is legal or not? I use some similar tricks to get from the UIBarButtonItem to the view that is represented from it, and it has never been a problem.

For example, I use following snippet without any issues. Technically this isn't using private API per so, but relying on undocumented view structure and here also part of the class names, so you really should know what you're doing. Please also file a radar that UIBarButtonItem is messed up and misses an obvious flag to get to the actual view.

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

Also, if you go that route, write code that will fail gracefully if for any reason the view for the toolbar can't be found. I know some apps that go my route, while lots of others don't even bother and simply write their own code to create a toolbar.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share

548k questions

547k answers

4 comments

86.3k users

...