2

次を使用して、ナビゲーションバーにカスタムの背景を追加することができました。

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];

これは正常に機能し、タイトルとボタンは問題なく表示されます。ただし、1つのレベルをドリルダウンしてからルートに戻ると、ボタンは非表示になっていますが、タイトルは表示されたままです。ナビゲーションバーの画像がボタンアイテムを覆っているようです。

下部に挿入しているので混乱しているので、ナビゲーションアイテムを押したりポップしたりすると、ナビゲーションバーの他のビューの上に表示されると思います。

何か案は?

ありがとう、

マイク

4

5 に答える 5

12

ここからの説明に続いて、ナビゲーションバーにカテゴリを追加することをお勧めします。

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);

}
@end
于 2009-09-16T12:29:36.057 に答える
1

iOS 5ではこれは機能しませんが、良いニュースはこれを行う簡単な方法があるということです

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

注:これはiOS 5以降でのみ機能するため、下位互換性を確保する場合はiOSのバージョンを確認してください。

于 2011-10-19T22:06:03.290 に答える
1

NavigationBarのサブビューは絶えず変化しています。つまり、すべてのビューが表示/非表示になるため、サブビュー配列のインデックス0に追加されたimageviewがあると期待するべきではありません。

これをviewDidAppearで追加してみることができます(ナビゲーションアイテムを管理するすべてのビューコントローラーで/:):

NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);

for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
    [[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}

NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);

私はHauekのソリューションを使用しましたが、バーが他のコントローラーで異なるフレーバーを持っている場合、とにかく、これは最良のオプションではありません。

少なくとも、あなたがやっていたことがうまくいかなかった理由を理解するのに役立つことを願っています、

于 2011-12-10T18:00:06.083 に答える
0

drawRect:で行う代わりに、UINavigationBarカテゴリクラスのdrawLayer:inContext:メソッドをオーバーライドできます。drawLayer:inContext:メソッド内で、使用する背景画像を描画できます。また、アプリが複数のインターフェースの向きをサポートしている場合は、縦向きと横向きのインターフェースの向きに異なる画像を選択できます。

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
    CGContextClip(context);
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}

UINavigationBarの外観のカスタマイズに関するこの完全なデモXcodeプロジェクトも役立つ場合があります。

于 2011-02-13T09:54:53.603 に答える
0

UINavigationBarに新しい背景を追加する方法は次のとおりです。

/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];
于 2012-02-21T20:18:49.850 に答える