A lightweight UIViewController category extension for UINavigationBar appearance management, view controller push/pop/dismiss management, ViewController view statistics,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- ViewController view statistics
- Other convenient properties
Reference to this demo on github, 中文介绍戳这里。
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
-(BOOL)prefersNavigationBarHidden;
-(BOOL)prefersNavigationBarTransparent;
-(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;
else
mode = YES;
if(mode != _previewMode)
{
_previewMode = mode;
//force navigation appearance update
[self updateNavigationAppearance:YES];
}
}
-(BOOL)prefersNavigationBarTransparent
{
if(_previewMode)
return NO;
else
return YES;
}
-(nullable UIColor *)preferredNavigationItemColor
{
if(_previewMode)
return [UIColor whiteColor];
else
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;
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
-(void)didReceiveMemoryLeakWarning;
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
onTiming:RRMethodInsertTimingBefore
withBlock:^(UIViewController * _Nonnull viewController, BOOL animated) {
[MyLog logEnterPage:NSStringFromClass([viewController class])];
}];
//log the user leaving page behavior
[UIViewController hookLifecycle:RRViewControllerLifeCycleViewDidDisappear
onTiming:RRMethodInsertTimingAfter
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"
fix bug
Hide navigation back arrow after reset the stack by: -[UINavigationController setViewControllers:]
Roen (罗亮富), zxllf23@163.com
All source code is licensed under the MIT License