关于C#:如何动态覆盖UINavigationBar中的drawRect方法?

How to override the drawRect method in UINavigationBar dynamically?

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

我当前必须设置的代码可以正常工作,但动态部分除外。 是否可以在运行时重写drawRect方法以动态设置背景图像?

1
2
3
4
5
6
7
8
@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

使用类别覆盖方法是错误的事情,即使在这种情况下也可以使用。

如果您在NIB中实例化了导航控制器,则可以子类化UINavigationBar,然后在Interface Builder中将导航控制器的bar类设置为您自己的bar类。 完成此操作后,您将可以更好地控制导航栏的外观。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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。