如何动态覆盖UINavigationBar中的drawRect方法?

时间:2011-02-20 11:33:36

标签: objective-c uinavigationbar

我的大多数应用程序都有一个静态UINavigationBar,但最后我有一些视图控制器需要根据视图控制器本身的某些属性动态设置背景图像。

我目前必须设置的代码工作正常,除了动态部分。是否可以在运行时覆盖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

1 个答案:

答案 0 :(得分:7)

使用类别覆盖方法是一件错误的事情,即使它适用于这种特殊情况。

如果您在NIB中实例化导航控制器,则可以继承UINavigationBar,并在Interface Builder中将导航控制器的bar类设置为您自己的类。一旦这样做,您就可以更好地控制导航栏的外观。

@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:中将customImage属性重置为nil。