UINavigationBarの問題のカスタム背景
-
07-07-2019 - |
質問
次を使用して、ナビゲーションバーにカスタム背景を追加できました。
UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];
これは正常に機能し、タイトルとボタンは正常に表示されます。ただし、1レベル下にドリルダウンしてルートに戻ると、ボタンは非表示になりますが、タイトルは表示されたままです。ナビゲーションバーの画像がボタン項目を覆っているように見えます。
一番下に挿入しているので混乱しているので、ナビゲーション項目がプッシュおよびポップされたとき、ナビゲーションバーの他のビューの上に表示されると思います。
アイデアはありますか
ありがとう、
マイク
解決
こちら、ナビゲーションバーにカテゴリを追加することをお勧めします。
@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
他のヒント
iOS 5ではこれは機能しませんが、良いニュースはこれを行う簡単な方法があることです
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];
注:これはiOS 5以降でのみ機能するため、後方互換性を確保する場合はiOSバージョンを確認してください。
NavigationBarのサブビューは絶えず変化しています。つまり、すべてのビューが表示/非表示になるため、サブビュー配列のインデックス0に追加された画像ビューがあるとは考えないでください。
viewDidAppearでこれを追加することができます(ナビゲーションアイテムを管理するすべてのViewControllerで/:):
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のソリューションを使用しましたが、バーが他のコントローラーと異なるフレーバーを持っている場合、いくつかの小さな問題が発生する可能性があります。とにかく、これは最良のオプションではありません。
少なくともあなたがやっていたことが機能しなかった理由を理解するのに役立つことを願っています
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);
}
この完全なデモXcodeプロジェクト UINavigationBarの外観をカスタマイズすることも役立ちます。
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];