2011-02-20 9 views
2

私はほとんどのアプリケーションで静的なUINavigationBarを持っていますが、最後にはビューコントローラ自体のいくつかのプロパティに基づいて背景イメージを動的に設定する必要があるビューコントローラがいくつかあります。UINavigationBarのdrawRectメソッドを動的にオーバーライドする方法は?

私は現在、これを設定しなければならないコードは、動的部分を除いてうまく動作します。実行時にdrawRectメソッドをオーバーライドしてバックグラウンドイメージを動的に設定することは可能ですか?

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

答えて

7

カテゴリを持つメソッドをオーバーライドすることは、この特定のケースでは機能しますが、間違ったことです。

ナビゲーションコントローラがNIBでインスタンス化されている場合は、UINavigationBarをサブクラス化し、ナビゲーションコントローラのバークラスをInterface Builderで独自のものに設定できます。これを実行すると、ナビゲーションバーの外観をより詳細に制御できます。

@interface MyNavigationBar : UINavigationBar 
{ 
    UIImage* customImage; 
} 
@property(nonatomic,retain) UIImage* customImage; 
@end 

@implementation MyNavigationBar 
-(void)drawRect:(CGRect)rect 
{ 
    if (self.customImage) { 
     // draw your own image 
    } else { 
     [super drawRect:rect]; 
    } 
} 
@end 

「カスタマイズ」ビューコントローラはviewWillDisappear:にnilにcustomImageプロパティをリセットさせることを忘れないでください。

+0

素晴らしい、ありがとう!私はこのテクニックを使ってバーを通常通り描き、それにテクスチャを与えるために自分自身のアルファパターンを上に置きます。これは、スーパーdrawrectを呼び出す能力を与えるので、これを実現する唯一のテクニックです。 – Chris

関連する問題