Latest 1.2.3
License MIT
Platforms ios 8.0, requires ARC
Frameworks UIKit


A lightweight UIViewController category extension for UINavigationBar appearance management, view controller push/pop/dismiss management, memory leak detection and other convenient property and methods. Benefits include:

  • Manage UINavigationBar appearance gracefully
  • Automatic viewController memory leak detection with out any code modification.
  • Push/pop with completion block call back block
  • UIViewController life cycle method hook
  • Other convenient properties

Reference to this demo on github


UINavigationBar appearance management

make specific UINavigationBar bar appearance specific for each viewcontroller staticly or dynamicly just by overriding method of your viewcontroller, which are defined in UIViewController+RRExtension.h

//override any of the methods below in your viewcontroller's .m file to make specific navigation bar appearance


-(nullable UIColor *)preferredNavatationBarColor;
-(nullable UIColor *)preferredNavigationItemColor;
-(nullable UIImage *)preferredNavigationBarBackgroundImage;
-(nullable NSDictionary *)preferredNavigationTitleTextAttributes;

Make UINavigationBar bar appearance dynamic change, call [self updateNavigationAppearance:YES]; in your viewcontroller’s .m file to force the update.
A typical example:

    //typically in your UIScrollViewDelegate method
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
        BOOL mode;
        if(scrollView.contentOffset.y > 300)
            mode = NO;
            mode = YES;

        if(mode != _previewMode)
            _previewMode = mode;

            //force navigation appearance update
            [self updateNavigationAppearance:YES];

            return NO;
            return YES;

    -(nullable UIColor *)preferredNavigationItemColor
            return [UIColor whiteColor];
            return [UIColor blackColor];;

You can specify default UINavigationBar appearance by using [[UINavigationBar appearance] setXXX:] globally.

[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:0 green:0.45 blue:0.8 alpha:1.0]];
[[UINavigationBar appearance] setTintColor:[UIColor redColor]];
NSDictionary * dict = [NSDictionary dictionaryWithObject:[UIColor yellowColor] forKey:NSForegroundColorAttributeName];
[[UINavigationBar appearance] setTitleTextAttributes:dict];

You can also specify the default UINavigationBar appearance for each UINavigationController instance by setting properties defined in UINavigationController+RRSet.h

// set default navigation bar appearance
@property (nonatomic) BOOL defaultNavigationBarHidden;
@property (nonatomic) BOOL defaultNavigationBarTransparent;

@property (nonatomic,copy) UIColor *defaultNavatationBarColor;
@property (nonatomic,copy) UIColor *defaultNavigationItemColor;
@property (nonatomic,strong) UIImage *defaultNavigationBarBackgroundImage;
@property (nonatomic,copy) NSDictionary *defaultNavigationTitleTextAttributes;

Memory leak detection

to detect memory leak on runtime for viewcontrollers, all you have to do is just import the RRViewControllerExtension to your project. whenever a memory leak happened, there will be a alert show on your app.

you can also spcify which class of UIViewController or more precisely on which UIViewController instance you want to do the memory leak detection by reference to methods below in UIViewController+RRExtension.h

//Unavailable in release mode. 
in debug mode, defalut is NO for classes returned from +memoryLeakDetectionExcludedClasses method and YES for others
@property (nonatomic,getter = memoryLeakDetectionEnabled) BOOL enabledMemoryLeakDetection;

//read and add or remove values from the returned set to change default excluded memory detection classes
+(NSMutableSet<NSString *> *)memoryLeakDetectionExcludedClasses;

//for subclass to override

viewController life cylcle hook

hook any of the UIViewController life cycylcle method before or after execution, for instacne if you want to track the user page viewing behavior, you just need to write code in your AppDelgate.m like:

//log the user enter page behavior
[UIViewController hookLifecycle:RRViewControllerLifeCycleViewWillAppear
                      withBlock:^(UIViewController * _Nonnull viewController, BOOL animated) {

                        [MyLog logEnterPage:NSStringFromClass([viewController class])];

//log the user leaving page behavior
[UIViewController hookLifecycle:RRViewControllerLifeCycleViewDidDisappear
                      withBlock:^(UIViewController * _Nonnull viewController, BOOL animated) {

                        [MyLog logLeavePage:NSStringFromClass([viewController class])];


To install using CocoaPods, add the following to your project Podfile:

pod 'RRViewControllerExtension'

and in your project file importing by:

#import <RRViewControllerExtension.h>

Alternatively, drag and drop RRViewControllerExtension directory from this code project into your Xcode project, importing files by:

#import "RRViewControllerExtension.h"


Roen, [email protected]


All source code is licensed under the MIT License

Latest podspec

    "name": "RRUIViewControllerExtension",
    "version": "1.2.3",
    "summary": "UINavigationBar appearance management, memory leak detection, convenient UIViewController property and methods.",
    "description": "A lightweight UIViewController category extension for UINavigationBar appearance management, view controller push/pop/dismiss management, memory leak detection and other convenient property and methods.",
    "homepage": "",
    "license": "MIT",
    "authors": {
        "u7f57u4eaeu5bcc(Roen)": "[email protected]"
    "social_media_url": "",
    "platforms": {
        "ios": "8.0"
    "source": {
        "git": "",
        "tag": "1.2.3"
    "source_files": "RRUIViewControllerExtension/**/*.{h,m}",
    "public_header_files": "RRUIViewControllerExtension/*.h",
    "resources": "RRUIViewControllerExtension/resources/**/*",
    "frameworks": "UIKit",
    "requires_arc": true

Pin It on Pinterest

Share This