RRViewControllerExtension是我在很久之前寫的一個輕量級的UIViewController
分類吭历,并且已經(jīng)在戶外助手上得到了成熟的應(yīng)用揽碘。
開發(fā)者只需要在Xcode工程中加入'RRViewControllerExtension'的代碼麦锯,甚至都不需要#import
任何頭文件篮绰,就可以輕松地實現(xiàn)不同的UIViewController
的導(dǎo)航欄UINavigationBar
的“獨立”管理喘蟆,包括導(dǎo)航欄顯示/隱藏钉鸯、設(shè)置背景色吧史、背景圖片、背景透明唠雕、title顏色字體以及UINavigationItem
顏色贸营。
另外 RRViewControllerExtension還可以準(zhǔn)確地實時監(jiān)測每一個UIViewController
是否存在內(nèi)存泄漏。
其主要功能包括:
- 優(yōu)雅地管理各個視圖
UINavigationBar
顯示樣式 -
UIViewController
內(nèi)存泄漏自動檢測 - push/pop 完成后block回調(diào)
-
UIViewController
生命周期方法hook - 其他
UIViewController
方便的接口方法
github 演示demo
預(yù)覽
安裝
-
CocoaPods安裝
在你工程文件的Podfile中加入
pod 'RRViewControllerExtension'
- 直接下載源碼
你還可以從這里 下載源碼并將RRViewControllerExtension文件夾拖入你的xcode工程文件
注意:一些特定的功能使用需要引入頭文件#import <RRViewControllerExtension.h>
或者#import "RRViewControllerExtension.h"
取決于你是源碼導(dǎo)入還是cocopods導(dǎo)入岩睁。
使用
-
導(dǎo)航欄
UINavigationBar
不同顯示樣式管理
定制導(dǎo)航欄 UINavigationBar
在不同UIViewController
不同的顯示樣式 钞脂,你只需要在vc的.m文件中實現(xiàn)以下方法(在UIViewController+RRExtension.h
中定義的)中的任何一個或多個即可
//override any of the methods below in your viewcontroller's .m file to make specific navigation bar appearance
//當(dāng)前界面導(dǎo)航欄是否隱藏
-(BOOL)prefersNavigationBarHidden;
//當(dāng)前界面導(dǎo)航欄是否設(shè)置為透明(只是導(dǎo)航欄透明,navigationItem依然顯示)
-(BOOL)prefersNavigationBarTransparent;
//導(dǎo)航欄背景色
-(nullable UIColor *)preferredNavatationBarColor;
//navigationItem顏色
-(nullable UIColor *)preferredNavigationItemColor;
//導(dǎo)航欄背景圖片
-(nullable UIImage *)preferredNavigationBarBackgroundImage;
//title顯示樣式字典
-(nullable NSDictionary *)preferredNavigationTitleTextAttributes;
-
設(shè)定導(dǎo)航欄
UINavigationBar
默認(rèn)顯示樣式
在大部分情況下捕儒,我們并不需要去設(shè)置每一個viewcontroller的導(dǎo)航欄顯示樣式冰啃,只需讓它們顯示默認(rèn)樣式即可,設(shè)置默認(rèn)樣式有兩種方式:
- 通過
UINavigationBar
appearance 設(shè)置
UINavigationBar
遵循UIAppearance
協(xié)議刘莹,可以通過[[UINavigationBar appearance] setXXX:]
設(shè)定導(dǎo)航欄UINavigationBar
的全局默認(rèn)顯示樣式阎毅,這種設(shè)置是全局性的,也就是說在你的app中所有的導(dǎo)航欄都采用這種默認(rèn)顯示樣式点弯。
[[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];
- 通過RRViewControllerExtension設(shè)置
通過RRViewControllerExtensionUINavigationController+RRSet
中定義的屬性扇调,設(shè)定每一個導(dǎo)航控制器導(dǎo)航欄UINavigationBar
默認(rèn)顯示樣式,這種設(shè)定針對的是每一個導(dǎo)航控制器實例對象抢肛,此時需要引入頭文件RRViewControllerExtension.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;
動態(tài)修改導(dǎo)航欄顯示
坑爹的產(chǎn)品經(jīng)常會給我們出這樣的需求狼钮,根據(jù)scrollView的滾動高度,來隱藏/顯示導(dǎo)航欄雌团,或者把導(dǎo)航欄設(shè)置成透明樣式燃领,改變導(dǎo)航欄按鈕顏色等待,凡此種種操作锦援,現(xiàn)在都能輕松應(yīng)對猛蔽;程序員只要在對應(yīng)的方法中,根據(jù)不同的狀態(tài)返回不同的值灵寺,然后再達(dá)到觸發(fā)條件的時候曼库,調(diào)用
[self updateNavigationAppearance:YES];
舉個栗子:
//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];;
}
智能內(nèi)存泄漏檢測
該功能默認(rèn)只在debug模式下開啟
只需要將RRViewControllerExtension加入到你的xcode工程當(dāng)中,就可以實現(xiàn)viewcontroller內(nèi)存泄漏的檢測略板,一旦viewcontroller在消失后內(nèi)存空間沒有被釋放毁枯,在你的app當(dāng)中就會彈出內(nèi)存泄漏警告提醒,如下圖
某些特定的viewcontroller我們并不希望它在消失后馬上銷毀叮称,而是可以留著復(fù)用种玛,比如微信的朋友圈就這樣做的(我的必問面試題)藐鹤,這種情況我們并不希望將其認(rèn)定為內(nèi)存泄漏,RRViewControllerExtension提供的方法可以指定某一“個”viewcontroller實例或者某一“類”viewcontroller不參與內(nèi)存泄漏監(jiān)測
//Unavailable in release mode. in debug mode, defalut is NO for classes returned from +memoryLeakDetectionExcludedClasses method and YES for others
//當(dāng)前viewController是否開啟內(nèi)存泄漏檢測
@property (nonatomic,getter = memoryLeakDetectionEnabled) BOOL enabledMemoryLeakDetection;
//read and add or remove values from the returned set to change default excluded memory detection classes
//將你不希望參與內(nèi)存泄漏檢測的類添加到這個讀取的set里面
+(NSMutableSet<NSString *> *)memoryLeakDetectionExcludedClasses;
//for subclass to override
//當(dāng)發(fā)生內(nèi)存泄漏時收到消息方法回調(diào)赂韵,子類可以重寫
-(void)didReceiveMemoryLeakWarning;