275 lines
12 KiB
Mathematica
275 lines
12 KiB
Mathematica
|
|
//
|
|||
|
|
// 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 ()<UINavigationControllerDelegate>
|
|||
|
|
|
|||
|
|
@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<UIViewControllerTransitionCoordinator>)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<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
|
|||
|
|
[self updateNavigationBarForViewController:viewController];
|
|||
|
|
} completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
|
|||
|
|
if (context.isCancelled) {
|
|||
|
|
[self updateNavigationBarForViewController:from];
|
|||
|
|
} else {
|
|||
|
|
[self updateNavigationBarForViewController:viewController];
|
|||
|
|
}
|
|||
|
|
}];
|
|||
|
|
|
|||
|
|
if (@available(iOS 10.0, *)) {
|
|||
|
|
[coordinator notifyWhenInteractionChangesUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
|
|||
|
|
;
|
|||
|
|
}];
|
|||
|
|
} else {
|
|||
|
|
[coordinator notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
|
|||
|
|
;
|
|||
|
|
}];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
|
|||
|
|
{
|
|||
|
|
// NSLog(@"willShowViewController %@", viewController);
|
|||
|
|
id<UIViewControllerTransitionCoordinator> 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<UIGestureRecognizerDelegate>)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<UIViewController *> *)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<UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated {
|
|||
|
|
NSArray *array = [super popToViewController:viewController animated:animated];
|
|||
|
|
[self updateTitleTextAttributesWithTopVC];
|
|||
|
|
|
|||
|
|
return array;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
- (NSArray<UIViewController *> *)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<UIViewControllerTransitionCoordinator> 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
|