iOS 封裝UINavigationController

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.使用

繼承即可使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容