iOS5でのUINavigationBarの背景画像処理




iOS5以前でUINavigationBarの背景に画像を使用する際には、いくつか方法がありました。
例えば以下の画像(navibar.png)を適用したい場合
[navibar.png]


よく利用していたパターン2つを参考としてあげます。

【NavigationBarカテゴリでdrawRect】

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



【NavigationBarにinsertSubview】

    #import <QuartzCore/QuartzCore.h>
    ..
    ..
    UIImage *image = [UIImage imageNamed:@"navibar.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = self.navigationController.navigationBar.bounds;
    imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth
                                  | UIViewAutoresizingFlexibleHeight);
    imageView.layer.zPosition = -FLT_MAX;
    [self.navigationController.navigationBar insertSubview:imageView atIndex:0];




ですが、これらの方法はiOS5以降では使用できなくなっています。

iOS5だと変化なし

iOS5以降のUINavigationBarには
- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
メソッドが用意されており、Viewの構成が変わったようです。
なので、iOS5以降では上記のパターンは以下のように修正しておく必要があります。

【NavigationBarカテゴリでdrawRect】
UINavigationBar (UINavigationBarCategory) は残しつつ以下処理を追加

    // iOS 5用  メソッドの有無で確認
    if([self.navigationController.navigationBar
        respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] )
    {
        [self.navigationController.navigationBar setBackgroundImage:image
                                                      forBarMetrics:UIBarMetricsDefault];
    }



【NavigationBarにinsertSubview】
if文で振り分け

    #import <QuartzCore/QuartzCore.h>
    ..
    ..
    UIImage *image = [UIImage imageNamed:@"navibar.png"];
    // iOS 5用 メソッドの有無で確認
    if([self.navigationController.navigationBar
        respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] )
    {
        [self.navigationController.navigationBar setBackgroundImage:image
                                                      forBarMetrics:UIBarMetricsDefault];
    }
    // iOS 4.3以前
    else
    {
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
        imageView.frame = self.navigationController.navigationBar.bounds;
        imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth
                                      | UIViewAutoresizingFlexibleHeight);
        imageView.layer.zPosition = -FLT_MAX;
        [self.navigationController.navigationBar insertSubview:imageView atIndex:0];
    }



うまく適用できました。


では、今回はこの辺りで。






Shareしていただけると励みになりますので
良ければよろしくお願いします