0.相關(guān)類見《iOS 封裝UIViewController》
1.配置類
//
// SFNavigationControllerConfig.h
// template
//
// Created by shefeng on 2024/6/24.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface SFNavigationControllerConfig : NSObject
/**
* 背景色
*/
@property (strong, nonatomic) UIColor *bgColor;
/**
* 陰影色
*/
@property (strong, nonatomic) UIColor *shadowColor;
/**
* 返回按鈕圖片名稱
*/
@property (strong, nonatomic) NSString *backImageName;
/**
* 標(biāo)題顏色
*/
@property (strong, nonatomic) UIColor *titleColor;
/**
* 標(biāo)題字體
*/
@property (strong, nonatomic) UIFont *titleFont;
/**
* 單例
*/
+ (instancetype)sharedConfig;
@end
NS_ASSUME_NONNULL_END
//
// SFNavigationControllerConfig.m
// template
//
// Created by shefeng on 2024/6/24.
//
#import "SFNavigationControllerConfig.h"
@implementation SFNavigationControllerConfig
+ (instancetype)sharedConfig{
static dispatch_once_t onceToken;
static SFNavigationControllerConfig *instance;
dispatch_once(&onceToken, ^{
instance = [[SFNavigationControllerConfig alloc] init];
});
return instance;
}
- (UIColor *)bgColor{
if (_bgColor == nil) {
_bgColor = [UIColor whiteColor];
}
return _bgColor;
}
- (UIColor *)shadowColor{
if (_shadowColor == nil) {
_shadowColor = [UIColor clearColor];
}
return _shadowColor;
}
- (NSString *)backImageName{
if (_backImageName == nil) {
_backImageName = @"";
}
return _backImageName;
}
- (UIColor *)titleColor{
if (_titleColor == nil) {
_titleColor = [UIColor blackColor];
}
return _titleColor;
}
- (UIFont *)titleFont{
if (_titleFont == nil) {
_titleFont = [UIFont systemFontOfSize:16];
}
return _titleFont;
}
@end
3.基類
//
// SFBaseNavigationController.h
// template
//
// Created by shefeng on 2024/6/24.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface SFBaseNavigationController : UINavigationController
/**
* 根據(jù)圖片、按鈕樣式、事件設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param image 圖片
* @param style 按鈕樣式
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem image:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action isLeft:(BOOL)isLeft;
/**
* 根據(jù)標(biāo)題、標(biāo)題屬性、按鈕樣式、事件設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param text 標(biāo)題
* @param textAttr 標(biāo)題屬性
* @param style 按鈕樣式
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem text:(NSString *)text textAttr:(NSDictionary *)textAttr style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action isLeft:(BOOL)isLeft;
/**
* 根據(jù)UIBarButtonItem設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param barButtonItem 按鈕
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem barButtonItem:(UIBarButtonItem *)barButtonItem isLeft:(BOOL)isLeft;
/**
* 根據(jù)UIBarButtonItems設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param barButtonItems 按鈕集合
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem barButtonItems:(NSArray<UIBarButtonItem *> *)barButtonItems isLeft:(BOOL)isLeft;
/**
* 根據(jù)自定義視圖設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param customView 自定義視圖
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem customView:(UIView *)customView isLeft:(BOOL)isLeft;
/**
* 配置導(dǎo)航欄屬性
*
* @param navigationBar 導(dǎo)航欄
*/
- (void)configCustomNavigationBarProp:(UINavigationBar *)navigationBar;
/**
* 獲取屏幕邊框區(qū)域pan手勢(shì)
*/
- (UIScreenEdgePanGestureRecognizer *)screenEdgePanGestureRecognizer;
@end
NS_ASSUME_NONNULL_END
//
// SFBaseNavigationController.m
// template
//
// Created by shefeng on 2024/6/24.
//
#import "SFBaseNavigationController.h"
#import "SFBaseViewController.h"
#import "SFNavigationControllerConfig.h"
#import "UIImage+SFUtil.h"
@interface SFBaseNavigationController ()<UIGestureRecognizerDelegate,UINavigationControllerDelegate>
@end
@implementation SFBaseNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
}
/**
* 重寫initWithRootViewController方法設(shè)置代理
* @param rootViewController 根視圖
* @return 實(shí)例
*/
- (id)initWithRootViewController:(UIViewController *)rootViewController {
SFBaseNavigationController *nav = [super initWithRootViewController:rootViewController];
nav.interactivePopGestureRecognizer.delegate = self;
nav.delegate = self;
return nav;
}
#pragma mark - UINavigationItem相關(guān)
/**
* 根據(jù)圖片、按鈕樣式、事件設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param image 圖片
* @param style 按鈕樣式
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem image:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action isLeft:(BOOL)isLeft{
//[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] => 保持原色
UIImage *originalImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[self configBarButtonItem:navItem barButtonItem:[[UIBarButtonItem alloc] initWithImage:originalImage style:style target:target action:action] isLeft:isLeft];
}
/**
* 根據(jù)標(biāo)題、標(biāo)題屬性、按鈕樣式、事件設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param text 標(biāo)題
* @param textAttr 標(biāo)題屬性
* @param style 按鈕樣式
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem text:(NSString *)text textAttr:(NSDictionary *)textAttr style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action isLeft:(BOOL)isLeft{
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:text style:style target:target action:action];
if (textAttr && textAttr.allKeys.count > 0) {
[barButtonItem setTitleTextAttributes:textAttr forState:UIControlStateNormal];
}
[self configBarButtonItem:navItem barButtonItem:barButtonItem isLeft:isLeft];
}
/**
* 根據(jù)UIBarButtonItem設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param barButtonItems 按鈕集合
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem barButtonItems:(NSArray<UIBarButtonItem *> *)barButtonItems isLeft:(BOOL)isLeft{
if (isLeft) {
navItem.leftBarButtonItems = barButtonItems;
}else{
navItem.rightBarButtonItems = barButtonItems;
}
}
/**
* 根據(jù)自定義視圖設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param customView 自定義視圖
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem customView:(UIView *)customView isLeft:(BOOL)isLeft{
[self configBarButtonItem:navItem barButtonItem:[[UIBarButtonItem alloc] initWithCustomView:customView] isLeft:isLeft];
}
/**
* 根據(jù)UIBarButtonItem設(shè)置導(dǎo)航欄按鈕
*
* @param navItem 導(dǎo)航欄item
* @param barButtonItem 按鈕
* @param isLeft 是否是左邊
*/
- (void)configBarButtonItem:(UINavigationItem *)navItem barButtonItem:(UIBarButtonItem *)barButtonItem isLeft:(BOOL)isLeft{
if (isLeft) {
navItem.leftBarButtonItem = barButtonItem;
}else{
navItem.rightBarButtonItem = barButtonItem;
}
}
/**
* 配置導(dǎo)航欄屬性
*
* @param navigationBar 導(dǎo)航欄
*/
- (void)configCustomNavigationBarProp:(UINavigationBar *)navigationBar{
UIImage *bgImage = [UIImage createImageWithColor:[SFNavigationControllerConfig sharedConfig].bgColor size:CGSizeMake(1, 1)];
UIImage *shadowImage = [UIImage createImageWithColor:[SFNavigationControllerConfig sharedConfig].shadowColor size:CGSizeMake(1, 1)];
NSDictionary *titleTextAttr = @{
NSForegroundColorAttributeName:[SFNavigationControllerConfig sharedConfig].titleColor,
NSFontAttributeName:[SFNavigationControllerConfig sharedConfig].titleFont
};
if (@available(iOS 15.0, *)) {
UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
[appearance configureWithDefaultBackground];
[appearance setBackgroundColor:[SFNavigationControllerConfig sharedConfig].bgColor];
[appearance setBackgroundImage:bgImage];
[appearance setShadowImage:shadowImage];
[appearance setTitleTextAttributes:titleTextAttr];
navigationBar.standardAppearance = appearance;
navigationBar.scrollEdgeAppearance = appearance;
}else{
navigationBar.translucent = NO;
[navigationBar setBackgroundColor:[SFNavigationControllerConfig sharedConfig].bgColor];
[navigationBar setBackgroundImage:bgImage forBarMetrics:UIBarMetricsDefault];
[navigationBar setShadowImage:shadowImage];
[navigationBar setTitleTextAttributes:titleTextAttr];
}
}
#pragma mark - UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.interactivePopGestureRecognizer) {
if (self.viewControllers.lastObject == self.topViewController && self.viewControllers.count > 1) {
if([self.topViewController isKindOfClass:[SFBaseViewController class]]) {
SFBaseViewController *baseViewController = (SFBaseViewController *)self.topViewController;
return baseViewController.enableSideslip;
}
return YES;
}
return NO;
}
return YES;
}
- (UIScreenEdgePanGestureRecognizer *)screenEdgePanGestureRecognizer {
UIScreenEdgePanGestureRecognizer *screenEdgePanGestureRecognizer = nil;
if (self.view.gestureRecognizers.count > 0) {
for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) {
if ([recognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
screenEdgePanGestureRecognizer = (UIScreenEdgePanGestureRecognizer *)recognizer;
break;
}
}
}
return screenEdgePanGestureRecognizer;
}
@end
4.配置
[SFNavigationControllerConfig sharedConfig].backImageName = @"icon_nav_back";
[SFNavigationControllerConfig sharedConfig].bgColor = [UIColor whiteColor];
[SFNavigationControllerConfig sharedConfig].shadowColor = [UIColor clearColor];
[SFNavigationControllerConfig sharedConfig].titleFont = [UIFont boldSystemFontOfSize:18];
[SFNavigationControllerConfig sharedConfig].titleColor = [UIColor blackColor];
5.使用
繼承即可使用