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 に答える