From 83b9d5c682b21d88133f24da0f94dd56bd79e687 Mon Sep 17 00:00:00 2001 From: 单军华 Date: Thu, 19 Jul 2018 13:38:55 +0800 Subject: [PATCH] change --- screendisplay/Pods/CYLTabBarController/CYLTabBarController/UIViewController+CYLTabBarControllerExtention.m | 296 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 296 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/CYLTabBarController/CYLTabBarController/UIViewController+CYLTabBarControllerExtention.m b/screendisplay/Pods/CYLTabBarController/CYLTabBarController/UIViewController+CYLTabBarControllerExtention.m new file mode 100644 index 0000000..676eb83 --- /dev/null +++ b/screendisplay/Pods/CYLTabBarController/CYLTabBarController/UIViewController+CYLTabBarControllerExtention.m @@ -0,0 +1,296 @@ +// +// UIViewController+CYLTabBarControllerExtention.m +// CYLTabBarController +// +// v1.16.0 Created by ������@iOS������������ ( http://weibo.com/luohanchenyilong/ ) on 16/2/26. +// Copyright �� 2016��� https://github.com/ChenYilong .All rights reserved. +// + +#import "UIViewController+CYLTabBarControllerExtention.h" +#import "CYLTabBarController.h" +#import <objc/runtime.h> + +@implementation UIViewController (CYLTabBarControllerExtention) + +#pragma mark - +#pragma mark - public Methods + +- (UIViewController *)cyl_popSelectTabBarChildViewControllerAtIndex:(NSUInteger)index { + UIViewController *viewController = [self cyl_getViewControllerInsteadOfNavigationController]; + [viewController checkTabBarChildControllerValidityAtIndex:index]; + [viewController.navigationController popToRootViewControllerAnimated:NO]; + CYLTabBarController *tabBarController = [viewController cyl_tabBarController]; + tabBarController.selectedIndex = index; + UIViewController *selectedTabBarChildViewController = tabBarController.selectedViewController; + return [selectedTabBarChildViewController cyl_getViewControllerInsteadOfNavigationController]; +} + +- (void)cyl_popSelectTabBarChildViewControllerAtIndex:(NSUInteger)index + completion:(CYLPopSelectTabBarChildViewControllerCompletion)completion { + UIViewController *selectedTabBarChildViewController = [self cyl_popSelectTabBarChildViewControllerAtIndex:index]; + dispatch_async(dispatch_get_main_queue(), ^{ + !completion ?: completion(selectedTabBarChildViewController); + }); +} + +- (UIViewController *)cyl_popSelectTabBarChildViewControllerForClassType:(Class)classType { + CYLTabBarController *tabBarController = [[self cyl_getViewControllerInsteadOfNavigationController] cyl_tabBarController]; + NSArray *viewControllers = tabBarController.viewControllers; + NSInteger atIndex = [self cyl_indexForClassType:classType inViewControllers:viewControllers]; + return [self cyl_popSelectTabBarChildViewControllerAtIndex:atIndex]; +} + +- (void)cyl_popSelectTabBarChildViewControllerForClassType:(Class)classType + completion:(CYLPopSelectTabBarChildViewControllerCompletion)completion { + UIViewController *selectedTabBarChildViewController = [self cyl_popSelectTabBarChildViewControllerForClassType:classType]; + dispatch_async(dispatch_get_main_queue(), ^{ + !completion ?: completion(selectedTabBarChildViewController); + }); +} + +- (void)cyl_pushOrPopToViewController:(UIViewController *)viewController + animated:(BOOL)animated + callback:(CYLPushOrPopCallback)callback { + if (!callback) { + [self.navigationController pushViewController:viewController animated:animated]; + return; + } + + void (^popSelectTabBarChildViewControllerCallback)(BOOL shouldPopSelectTabBarChildViewController, NSUInteger index) = ^(BOOL shouldPopSelectTabBarChildViewController, NSUInteger index) { + if (shouldPopSelectTabBarChildViewController) { + [self cyl_popSelectTabBarChildViewControllerAtIndex:index completion:^(__kindof UIViewController *selectedTabBarChildViewController) { + [selectedTabBarChildViewController.navigationController pushViewController:viewController animated:animated]; + }]; + } else { + [self.navigationController pushViewController:viewController animated:animated]; + } + }; + NSArray<__kindof UIViewController *> *otherSameClassTypeViewControllersInCurrentNavigationControllerStack = [self cyl_getOtherSameClassTypeViewControllersInCurrentNavigationControllerStack:viewController]; + + CYLPushOrPopCompletionHandler completionHandler = ^(BOOL shouldPop, + __kindof UIViewController *viewControllerPopTo, + BOOL shouldPopSelectTabBarChildViewController, + NSUInteger index + ) { + if (!otherSameClassTypeViewControllersInCurrentNavigationControllerStack || otherSameClassTypeViewControllersInCurrentNavigationControllerStack.count == 0) { + shouldPop = NO; + } + dispatch_async(dispatch_get_main_queue(),^{ + if (shouldPop) { + [self.navigationController popToViewController:viewControllerPopTo animated:animated]; + return; + } + popSelectTabBarChildViewControllerCallback(shouldPopSelectTabBarChildViewController, index); + }); + }; + callback(otherSameClassTypeViewControllersInCurrentNavigationControllerStack, completionHandler); +} + +- (void)cyl_pushViewController:(UIViewController *)viewController animated:(BOOL)animated { + UIViewController *fromViewController = [self cyl_getViewControllerInsteadOfNavigationController]; + NSArray *childViewControllers = fromViewController.navigationController.childViewControllers; + if (childViewControllers.count > 0) { + if ([[childViewControllers lastObject] isKindOfClass:[viewController class]]) { + return; + } + } + [fromViewController.navigationController pushViewController:viewController animated:animated]; +} + +- (UIViewController *)cyl_getViewControllerInsteadOfNavigationController { + BOOL isNavigationController = [[self class] isSubclassOfClass:[UINavigationController class]]; + if (isNavigationController && ((UINavigationController *)self).viewControllers.count > 0) { + return ((UINavigationController *)self).viewControllers[0]; + } + return self; +} + +#pragma mark - public method + +- (BOOL)cyl_isPlusChildViewController { + if (!CYLPlusChildViewController) { + return NO; + } + return (self == CYLPlusChildViewController); +} + +- (void)cyl_showTabBadgePoint { + if (self.cyl_isPlusChildViewController) { + return; + } + [self.cyl_tabButton cyl_showTabBadgePoint]; + [[[self cyl_getViewControllerInsteadOfNavigationController] cyl_tabBarController].tabBar layoutIfNeeded]; +} + +- (void)cyl_removeTabBadgePoint { + if (self.cyl_isPlusChildViewController) { + return; + } + [self.cyl_tabButton cyl_removeTabBadgePoint]; + [[[self cyl_getViewControllerInsteadOfNavigationController] cyl_tabBarController].tabBar layoutIfNeeded]; +} + +- (BOOL)cyl_isShowTabBadgePoint { + if (self.cyl_isPlusChildViewController) { + return NO; + } + return [self.cyl_tabButton cyl_isShowTabBadgePoint]; +} + +- (void)cyl_setTabBadgePointView:(UIView *)tabBadgePointView { + if (self.cyl_isPlusChildViewController) { + return; + } + [self.cyl_tabButton cyl_setTabBadgePointView:tabBadgePointView]; +} + +- (UIView *)cyl_tabBadgePointView { + if (self.cyl_isPlusChildViewController) { + return nil; + } + return [self.cyl_tabButton cyl_tabBadgePointView];; +} + +- (void)cyl_setTabBadgePointViewOffset:(UIOffset)tabBadgePointViewOffset { + if (self.cyl_isPlusChildViewController) { + return; + } + return [self.cyl_tabButton cyl_setTabBadgePointViewOffset:tabBadgePointViewOffset]; +} + +//offset��������������������������������������� +- (UIOffset)cyl_tabBadgePointViewOffset { + if (self.cyl_isPlusChildViewController) { + return UIOffsetZero; + } + return [self.cyl_tabButton cyl_tabBadgePointViewOffset]; +} + +- (BOOL)cyl_isEmbedInTabBarController { + if (self.cyl_tabBarController == nil) { + return NO; + } + if (self.cyl_isPlusChildViewController) { + return NO; + } + BOOL isEmbedInTabBarController = NO; + UIViewController *viewControllerInsteadIOfNavigationController = [self cyl_getViewControllerInsteadOfNavigationController]; + for (NSInteger i = 0; i < self.cyl_tabBarController.viewControllers.count; i++) { + UIViewController * vc = self.cyl_tabBarController.viewControllers[i]; + if ([vc cyl_getViewControllerInsteadOfNavigationController] == viewControllerInsteadIOfNavigationController) { + isEmbedInTabBarController = YES; + [self cyl_setTabIndex:i]; + break; + } + } + return isEmbedInTabBarController; +} + +- (void)cyl_setTabIndex:(NSInteger)tabIndex { + objc_setAssociatedObject(self, @selector(cyl_tabIndex), @(tabIndex), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (NSInteger)cyl_tabIndex { + if (!self.cyl_isEmbedInTabBarController) { + return NSNotFound; + } + + id tabIndexObject = objc_getAssociatedObject(self, @selector(cyl_tabIndex)); + NSInteger tabIndex = [tabIndexObject integerValue]; + return tabIndex; +} + +- (UIControl *)cyl_tabButton { + if (!self.cyl_isEmbedInTabBarController) { + return nil; + } + UITabBarItem *tabBarItem; + UIControl *control; + @try { + tabBarItem = self.cyl_tabBarController.tabBar.items[self.cyl_tabIndex]; + control = [tabBarItem cyl_tabButton]; + } @catch (NSException *exception) {} + return control; +} + +- (NSString *)cyl_context { + return objc_getAssociatedObject(self, @selector(cyl_context)); +} + +- (void)cyl_setContext:(NSString *)cyl_context { + objc_setAssociatedObject(self, @selector(cyl_context), cyl_context, OBJC_ASSOCIATION_COPY_NONATOMIC); +} + +- (BOOL)cyl_plusViewControllerEverAdded { + NSNumber *cyl_plusViewControllerEverAddedObject = objc_getAssociatedObject(self, @selector(cyl_plusViewControllerEverAdded)); + return [cyl_plusViewControllerEverAddedObject boolValue]; +} + +- (void)cyl_setPlusViewControllerEverAdded:(BOOL)cyl_plusViewControllerEverAdded { + NSNumber *cyl_plusViewControllerEverAddedObject = [NSNumber numberWithBool:cyl_plusViewControllerEverAdded]; + objc_setAssociatedObject(self, @selector(cyl_plusViewControllerEverAdded), cyl_plusViewControllerEverAddedObject, OBJC_ASSOCIATION_ASSIGN); +} + +#pragma mark - +#pragma mark - Private Methods + +- (NSArray<__kindof UIViewController *> *)cyl_getOtherSameClassTypeViewControllersInCurrentNavigationControllerStack:(UIViewController *)viewController { + NSArray *currentNavigationControllerStack = [self.navigationController childViewControllers]; + if (currentNavigationControllerStack.count < 2) { + return nil; + } + NSMutableArray *mutableArray = [currentNavigationControllerStack mutableCopy]; + [mutableArray removeObject:self]; + currentNavigationControllerStack = [mutableArray copy]; + + __block NSMutableArray *mutableOtherViewControllersInNavigationControllerStack = [NSMutableArray arrayWithCapacity:currentNavigationControllerStack.count]; + + [currentNavigationControllerStack enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + UIViewController *otherViewController = obj; + if ([otherViewController isKindOfClass:[viewController class]]) { + [mutableOtherViewControllersInNavigationControllerStack addObject:otherViewController]; + } + }]; + return [mutableOtherViewControllersInNavigationControllerStack copy]; +} + +- (void)checkTabBarChildControllerValidityAtIndex:(NSUInteger)index { + CYLTabBarController *tabBarController = [[self cyl_getViewControllerInsteadOfNavigationController] cyl_tabBarController]; + @try { + UIViewController *viewController; + viewController = tabBarController.viewControllers[index]; + UIButton *plusButton = CYLExternPlusButton; + BOOL shouldConfigureSelectionStatus = (CYLPlusChildViewController) && ((index != CYLPlusButtonIndex) && (viewController != CYLPlusChildViewController)); + if (shouldConfigureSelectionStatus) { + plusButton.selected = NO; + } + } @catch (NSException *exception) { + NSString *formatString = @"\n\n\ + ------ BEGIN NSException Log ---------------------------------------------------------------------\n \ + class name: %@ \n \ + ------line: %@ \n \ + ----reason: The Class Type or the index or its NavigationController you pass in method `-cyl_popSelectTabBarChildViewControllerAtIndex` or `-cyl_popSelectTabBarChildViewControllerForClassType` is not the item of CYLTabBarViewController \n \ + ------ END ---------------------------------------------------------------------------------------\n\n"; + NSString *reason = [NSString stringWithFormat:formatString, + @(__PRETTY_FUNCTION__), + @(__LINE__)]; + @throw [NSException exceptionWithName:NSGenericException + reason:reason + userInfo:nil]; + } +} + +- (NSInteger)cyl_indexForClassType:(Class)classType inViewControllers:(NSArray *)viewControllers { + __block NSInteger atIndex = NSNotFound; + [viewControllers enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + UIViewController *obj_ = [obj cyl_getViewControllerInsteadOfNavigationController]; + if ([obj_ isKindOfClass:classType]) { + atIndex = idx; + *stop = YES; + return; + } + }]; + return atIndex; +} + +@end -- Gitblit v1.8.0