How to subclass UINavigationBar for a UINavigationController programmatically?

后端 未结 6 447
半阙折子戏
半阙折子戏 2020-11-29 20:00

I\'m using a custom drawRect function to draw on UINavigationBar across my application in iOS4, it doesn\'t use images, only CoreGraphics.

Since you ca

6条回答
  •  -上瘾入骨i
    2020-11-29 20:32

    Had issues with answers 2-4 in iOS 4 (from AnswerBot's answer), and needed a way to load the UINavigationController programmatically (though the NIB method worked)... So I did this:

    Created a Blank XIB file (don't set file owner), add a UINavigationController (give it your custom UINavigationController's class), change the UINavigationBar to your custom class (here it's CustomNavigationBar), then create the following custom class header (CustomNavigationController.h in this case):

    #import 
    
    @interface CustomNavigationController : UINavigationController
    + (CustomNavigationController *)navigationController;
    + (CustomNavigationController *)navigationControllerWithRootViewController:(UIViewController *)rootViewController;
    @end
    

    and custom implementation (CustomNavigationController.mm)

    #import "CustomNavigationController.h"
    
    @interface CustomNavigationController ()
    
    @end
    
    @implementation CustomNavigationController
    + (CustomNavigationController *)navigationController
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomNavigationController" owner:self options:nil];
        CustomNavigationController *controller = (CustomNavigationController *)[nib objectAtIndex:0];
        return controller;
    }
    
    
    + (CustomNavigationController *)navigationControllerWithRootViewController:(UIViewController *)rootViewController
    {
        CustomNavigationController *controller = [CustomNavigationController navigationController];
        [controller setViewControllers:[NSArray arrayWithObject:rootViewController]];
        return controller;
    }
    
    - (id)init
    {
        self = [super init];
        [self autorelease]; // We are ditching the one they allocated.  Need to load from NIB.
        return [[CustomNavigationController navigationController] retain]; // Over-retain, this should be alloced
    }
    
    - (id)initWithRootViewController:(UIViewController *)rootViewController
    {
        self = [super init];
        [self autorelease];
        return [[CustomNavigationController navigationControllerWithRootViewController:rootViewController] retain];
    }
    @end
    

    Then you can just init that class instead of a UINavigationController, and you'll have your custom navigation bar. If you want to do it in a xib, change the class of UINavigationController and UINavigationBar inside of your XIB.

提交回复
热议问题