ios 5カスタムナビゲーションバーの問題


ios 5以前のシステムでは、ナビゲーションバーのカテゴリを定義することで、ナビゲーションバーをカスタマイズできます.
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
    // Drawing code
    UIImage *image = [[UIImage imageNamed:@"header.png"] retain];
    [image drawInRect:CGRectMake(0, 0,self.frame.size.width , self.frame.size.height)];
    [image release];
    }
@end

しかしios 5では、この方式は役に立たない.詳細はios 5.0リリースの説明を参照してください.
http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-5_0/_index.html#//apple_ref/doc/uid/TP40010949
 iOS 5 ,UINavigationBar, UIToolbar, and UITabBar  , drawRect: 。 。

したがって、iOS 5.0でカスタムナビゲーションバーを引き続き使用するには、次の2つの方法があります.
1.5.0で新しく提供されたUInavigationBarのメソッドsetBackgroundImage:forBarMetrics:を使用して背景を設定します.
ただし4.0等のシステムとの互換性のため、この方法を使用する前に判断しなければならない:(5.0以前のシステムでは従来の方法を引き続き使用)
(navigationbarを使用する場所ごとにこのメソッドを呼び出す必要があり、変更可能な場所が多い)
UINavigationBar *navBar = [myNavController navigationBar];
if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
{
    // set globablly for all UINavBars
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"brnlthr_nav.jpg"] forBarMetrics:UIBarMetricsDefault];
  // ...
}

2、UINavigationBarのサブクラスを使用する方式で実現する:(この方式ではnavigationbarを使用する場所ごとに修正する必要がなく、怠け者のやり方に属する)
@interface MyNavigationBar : UINavigationBar

@end

@implementation MyNavigationBar

- (void)drawRect:(CGRect)rect {
  [super drawRect:rect];
}
@end

@implementation UINavigationBar (LazyNavigationBar)
+ (Class)class {
  return NSClassFromString(@"MyNavigationBar");
}

-(void)drawRect:(CGRect)rect {
  UIImage *backImage = [UIImage imageNamed:@"backNav.png"];
 [backImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];      
}
@end

原文:http://www.cnblogs.com/zhulin/archive/2011/10/21/2219949.html