// // EHNavigationViewController.m // ExpressHelper // // Created by ko1o on 2019/3/7. // Copyright © 2019年 ko1o. All rights reserved. // #import "PYNavigationViewController.h" #import "PYBaseViewController.h" #import "UINavigationController+FDFullscreenPopGesture.h" @interface PYNavigationViewController () @end @implementation PYNavigationViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self.interactivePopGestureRecognizer addTarget:self action:@selector(handlePopGesture:)]; } + (void)initialize { [self customizeInterface]; } - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { self.fd_fullscreenPopGestureRecognizer.enabled = NO; //禁用全屏手势,引入FDFullscreen是优化导航栏隐藏时切换界面,系统的右滑动画体验不佳 self.delegate = self; } return self; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; } - (UIStatusBarStyle)preferredStatusBarStyle { return self.topViewController.preferredStatusBarStyle; } - (UIModalPresentationStyle)modalPresentationStyle { return UIModalPresentationFullScreen; } #pragma mark - UINavigationControllerDelegate - (void)updateTitleTextAttributesWithTopVC { self.navigationBar.barStyle = self.topViewController.mt_barStyle; self.navigationBar.titleTextAttributes = self.topViewController.mt_titleTextAttributes; } - (void)updateNavigationBarForViewController:(UIViewController *)vc { [vc mt_applyAppearanceToNavigationBar:self.navigationBar]; } - (void)transitionNavigationBarStyleWithCoordinator:(id)coordinator viewController:(UIViewController * _Nonnull)viewController { UIViewController *from = [coordinator viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *to = [coordinator viewControllerForKey:UITransitionContextToViewControllerKey]; if (self == to) { // to == self [self updateNavigationBarForViewController:viewController]; } [coordinator animateAlongsideTransition:^(id _Nonnull context) { [self updateNavigationBarForViewController:viewController]; } completion:^(id _Nonnull context) { if (context.isCancelled) { [self updateNavigationBarForViewController:from]; } else { [self updateNavigationBarForViewController:viewController]; } }]; if (@available(iOS 10.0, *)) { [coordinator notifyWhenInteractionChangesUsingBlock:^(id _Nonnull context) { ; }]; } else { [coordinator notifyWhenInteractionEndsUsingBlock:^(id _Nonnull context) { ; }]; } } - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated; { // NSLog(@"willShowViewController %@", viewController); id coordinator = self.transitionCoordinator; if (coordinator) { [self transitionNavigationBarStyleWithCoordinator:coordinator viewController:viewController]; } else { [self updateNavigationBarForViewController:viewController]; } } - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated; { // NSLog(@"didShowViewController %@", viewController); navigationController.interactivePopGestureRecognizer.enabled = NO; if (navigationController.viewControllers.count > 1 && !viewController.fd_interactivePopDisabled) { navigationController.interactivePopGestureRecognizer.delegate = (id)viewController; navigationController.interactivePopGestureRecognizer.enabled = YES; } } - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { if (self.childViewControllers.count == 1 && viewController.hidesBottomBarWhenPushed == NO) { viewController.hidesBottomBarWhenPushed = YES; } [super pushViewController:viewController animated:animated]; } - (void)setNavigationBarHidden:(BOOL)navigationBarHidden { [super setNavigationBarHidden:navigationBarHidden]; } - (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated { [super setNavigationBarHidden:hidden animated:animated]; self.viewControllers.lastObject.fd_prefersNavigationBarHidden = hidden; } - (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated { if (viewControllers.count > 1 && viewControllers.lastObject.hidesBottomBarWhenPushed == NO) { viewControllers.lastObject.hidesBottomBarWhenPushed = YES; } [super setViewControllers:viewControllers animated:animated]; } - (UIViewController *)popViewControllerAnimated:(BOOL)animated { UIViewController *vc = [super popViewControllerAnimated:animated]; [self updateTitleTextAttributesWithTopVC]; return vc; } - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated { NSArray *array = [super popToViewController:viewController animated:animated]; [self updateTitleTextAttributesWithTopVC]; return array; } - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated { NSArray *array = [super popToRootViewControllerAnimated:animated]; [self updateTitleTextAttributesWithTopVC]; return array; } - (void)setViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers { if (viewControllers.count > 1 && viewControllers.lastObject.hidesBottomBarWhenPushed == NO) { viewControllers.lastObject.hidesBottomBarWhenPushed = YES; } [super setViewControllers:viewControllers]; } + (UIBarButtonItem *)barButtonItemWithTitle:(NSString *)title textColor:(UIColor *)textColor target:(id)target action:(SEL) action { UIBarButtonItem * item = [[UIBarButtonItem alloc]initWithTitle:title style:UIBarButtonItemStylePlain target:target action:action]; textColor = textColor ?:[UIColor blackColor]; // 不必手动设置,导航栏的tintColor会适配 // [item setTitleTextAttributes:@{NSForegroundColorAttributeName : textColor} // forState:UIControlStateNormal]; // [item setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor mt_colorWithColor:textColor alphaScale:0.5] } // forState:UIControlStateHighlighted]; return item; } + (UIBarButtonItem *)barButtonItemWithTitle:(NSString *)title target:(id)target action:(SEL) action { UIBarButtonItem * item = [self barButtonItemWithTitle:title textColor:[UIColor blackColor] target:target action:action]; return item; } + (UIBarButtonItem *)barButtonItemWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedImage target:(id)target action:(SEL) action { UIBarButtonItem * item = [[UIBarButtonItem alloc]initWithImage:image style:UIBarButtonItemStylePlain target:target action:action]; return item; } + (void)customizeInterface { UINavigationBar *navigationBarAppearance = nil; if (@available(iOS 9, *)) { navigationBarAppearance = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[PYNavigationViewController class]]]; } else { navigationBarAppearance = [UINavigationBar appearanceWhenContainedIn:[PYNavigationViewController class], nil]; } UIImage *backgroundImage = ImageNamed(@"tabbar_backgound_image"); navigationBarAppearance.translucent = NO; [navigationBarAppearance setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault]; //导航栏按钮风格 // Color不必手动设置,导航栏的tintColor会适配 // UIColor * barButtonItemTitlecolor = [UIColor yellowColor]; // UIColor * barButtonItemTitlecolorHL = [UIColor mt_colorWithColor:barButtonItemTitlecolor alphaScale:0.5]; // [[UIBarButtonItem appearance]setTitleTextAttributes:@{NSFontAttributeName : MT_FONT_MEDIUM_NO_SCALE_SIZE(20), // NSForegroundColorAttributeName:barButtonItemTitlecolor, } forState:UIControlStateNormal]; [[UIBarButtonItem appearance]setTitleTextAttributes:@{NSFontAttributeName : MT_FONT_MEDIUM_NO_SCALE_SIZE(20), // NSForegroundColorAttributeName:barButtonItemTitlecolorHL, } forState:UIControlStateHighlighted]; [[UIBarButtonItem appearance]setTitleTextAttributes:@{NSFontAttributeName : MT_FONT_MEDIUM_NO_SCALE_SIZE(20), // NSForegroundColorAttributeName:barButtonItemTitlecolorHL, } forState:UIControlStateDisabled]; // UINavigationBar* navBar = [UINavigationBar appearance]; // //设置导航栏字体 // NSMutableDictionary* barDic = [NSMutableDictionary dictionary]; // barDic[NSFontAttributeName] = [UIFont boldSystemFontOfSize:20]; // barDic[NSForegroundColorAttributeName] = COLOR_WITH_RGB(0xFFFFFF); // [navBar setTitleTextAttributes:barDic]; // } UIColor* mt_blendColor(UIColor *from, UIColor *to, float percent) { CGFloat fromRed = 0; CGFloat fromGreen = 0; CGFloat fromBlue = 0; CGFloat fromAlpha = 0; [from getRed:&fromRed green:&fromGreen blue:&fromBlue alpha:&fromAlpha]; CGFloat toRed = 0; CGFloat toGreen = 0; CGFloat toBlue = 0; CGFloat toAlpha = 0; [to getRed:&toRed green:&toGreen blue:&toBlue alpha:&toAlpha]; CGFloat newRed = fromRed + (toRed - fromRed) * fminf(1, percent * 4) ; CGFloat newGreen = fromGreen + (toGreen - fromGreen) * fminf(1, percent * 4); CGFloat newBlue = fromBlue + (toBlue - fromBlue) * fminf(1, percent * 4); CGFloat newAlpha = fromAlpha + (toAlpha - fromAlpha) * fminf(1, percent * 4); return [UIColor colorWithRed:newRed green:newGreen blue:newBlue alpha:newAlpha]; } - (void)handlePopGesture:(UIScreenEdgePanGestureRecognizer *)recognizer { id coordinator = self.transitionCoordinator; PYBaseViewController *from = [coordinator viewControllerForKey:UITransitionContextFromViewControllerKey]; PYBaseViewController *to = [coordinator viewControllerForKey:UITransitionContextToViewControllerKey]; if ([from isKindOfClass:PYBaseViewController.class] && [to isKindOfClass:PYBaseViewController.class]) { if (recognizer.state == UIGestureRecognizerStateBegan || recognizer.state == UIGestureRecognizerStateChanged) { self.navigationBar.tintColor = mt_blendColor(from.mt_nav_tintColor, to.mt_nav_tintColor, coordinator.percentComplete); } else { if (coordinator.isCancelled) { self.navigationBar.tintColor = from.mt_nav_tintColor; } } } } @end