0

为什么这不起作用?我想 sublcas UINavigationBar 所以在 xcode 我点击新文件 - > 目标 c 类,类:CustomNavBar 子类:UINavigationBar

然后在导航控制器场景下的情节提要中,单击导航栏并将其类设置为 CustomNavBar。

然后我进入我的 CustomNaVBar 类并尝试添加自定义图像背景。

在 initWithFram 方法中,我添加了这个:

- (id)initWithFrame:(CGRect)frame
{
    NSLog(@"Does it get here?"); //no
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"];
        //  [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
        [self setBackgroundColor:[UIColor colorWithPatternImage:image]];
        [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
        NSLog(@"Does this get called?"); //no
    }
    return self;
}

我在控制台上看不到任何输出。

相反,我这样做是为了自定义 UINavBar,但我觉得它不像 sublasing 它那么正确。在我的第一个视图的 viewDidLoad 中,我添加了这一行:

- (void)viewDidLoad
{
    [super viewDidLoad];
    if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
        UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"];
        [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    }
}
4

4 回答 4

2

我同意瑞恩佩里的观点。除了他的回答:

你不应该把这段代码放进去initWithFrame,而是把你的代码放进去awakeFromNib

- (void) awakeFromNib {
    // Initialization code
    UIImage *image = [UIImage imageNamed:@"customNavBarImage.png"];
    //  [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    [self setBackgroundColor:[UIColor colorWithPatternImage:image]];
    [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    NSLog(@"Does this get called?"); //YES!!
}
于 2012-12-12T20:02:42.237 回答
1

根据 initWithFrame 的文档:

如果您使用 Interface Builder 来设计您的界面,则当您的视图对象随后从 nib 文件加载时,不会调用此方法。nib 文件中的对象被重构,然后使用它们的 initWithCoder: 方法进行初始化,该方法修改视图的属性以匹配存储在 nib 文件中的属性。有关如何从 nib 文件加载视图的详细信息,请参阅资源编程指南。

http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html

这就是该方法没有像您期望的那样被调用的原因。

于 2012-12-12T19:49:51.743 回答
1

从情节提要加载 UI 对象时,您必须使用initWithCoder:方法,因为这是指定的初始化程序。因此,使用此代码:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    NSLog(@"Does it get here?"); // now it does! 
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
       // ...
        NSLog(@"Does this get called?"); // yep it does! 
    }
    return self;
}
于 2014-03-26T18:11:04.543 回答
0

您可以对 UINavigation 栏进行子类化,如下所示:

@interface CustomNavigationBar : UINavigationBar

@end

@implementation CustomNavigationBar

- (void)drawRect:(CGRect)rect
{    
   //custom draw code
}

@end

//Begin of UINavigationBar background customization
@implementation UINavigationBar (CustomImage)

//for iOS 5 
+ (Class)class {
    return NSClassFromString(@"CustomNavigationBar");
}

@end
于 2012-12-12T20:05:50.577 回答