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/CYLTabBarController.m | 536 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 536 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/CYLTabBarController/CYLTabBarController/CYLTabBarController.m b/screendisplay/Pods/CYLTabBarController/CYLTabBarController/CYLTabBarController.m new file mode 100644 index 0000000..28dfe72 --- /dev/null +++ b/screendisplay/Pods/CYLTabBarController/CYLTabBarController/CYLTabBarController.m @@ -0,0 +1,536 @@ +// +// CYLTabBarController.m +// CYLTabBarController +// +// v1.16.0 Created by ������@iOS������������ ( http://weibo.com/luohanchenyilong/ ) on 10/20/15. +// Copyright �� 2015 https://github.com/ChenYilong . All rights reserved. +// + +#import "CYLTabBarController.h" +#import "CYLTabBar.h" +#import <objc/runtime.h> +#import "UIViewController+CYLTabBarControllerExtention.h" + +NSString *const CYLTabBarItemTitle = @"CYLTabBarItemTitle"; +NSString *const CYLTabBarItemImage = @"CYLTabBarItemImage"; +NSString *const CYLTabBarItemSelectedImage = @"CYLTabBarItemSelectedImage"; +NSString *const CYLTabBarItemImageInsets = @"CYLTabBarItemImageInsets"; +NSString *const CYLTabBarItemTitlePositionAdjustment = @"CYLTabBarItemTitlePositionAdjustment"; + +NSUInteger CYLTabbarItemsCount = 0; +NSUInteger CYLPlusButtonIndex = 0; +CGFloat CYLTabBarItemWidth = 0.0f; +NSString *const CYLTabBarItemWidthDidChangeNotification = @"CYLTabBarItemWidthDidChangeNotification"; +static void * const CYLTabImageViewDefaultOffsetContext = (void*)&CYLTabImageViewDefaultOffsetContext; + +@interface CYLTabBarController () <UITabBarControllerDelegate> + +@property (nonatomic, assign, getter=isObservingTabImageViewDefaultOffset) BOOL observingTabImageViewDefaultOffset; + +@end +@implementation CYLTabBarController + +@synthesize viewControllers = _viewControllers; + +#pragma mark - +#pragma mark - Life Cycle + +- (void)viewDidLoad { + [super viewDidLoad]; + if (CYL_IS_IPHONE_X) { + self.tabBarHeight = 83; + } + // ������tabBar������������������ tabBar ������ ������������ + [self setUpTabBar]; + // KVO������������ + if (!self.isObservingTabImageViewDefaultOffset) { + [self.tabBar addObserver:self forKeyPath:@"tabImageViewDefaultOffset" options:NSKeyValueObservingOptionNew context:CYLTabImageViewDefaultOffsetContext]; + self.observingTabImageViewDefaultOffset = YES; + } +} + +- (void)setViewDidLayoutSubViewsBlock:(CYLViewDidLayoutSubViewsBlock)viewDidLayoutSubviewsBlock { + _viewDidLayoutSubviewsBlock = viewDidLayoutSubviewsBlock; +} + +- (void)viewDidLayoutSubviews { + CGFloat deviceVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; + if (deviceVersion >= 10 && deviceVersion < 10.2) { + [self.tabBar layoutSubviews];//Fix issue #93 + } + UITabBar *tabBar = self.tabBar; + for (UIControl *control in tabBar.subviews) { + if ([control isKindOfClass:[UIControl class]]) { + SEL actin = @selector(didSelectControl:); + [control addTarget:self action:actin forControlEvents:UIControlEventTouchUpInside]; + } + } + !self.viewDidLayoutSubviewsBlock ?: self.viewDidLayoutSubviewsBlock(self); +} + +- (void)viewWillLayoutSubviews { + if (!(self.tabBarHeight > 0)) { + return; + } + self.tabBar.frame = ({ + CGRect frame = self.tabBar.frame; + CGFloat tabBarHeight = self.tabBarHeight; + frame.size.height = tabBarHeight; + frame.origin.y = self.view.frame.size.height - tabBarHeight; + frame; + }); +} + +- (UIInterfaceOrientationMask)supportedInterfaceOrientations { + UIViewController *controller = self.selectedViewController; + if ([controller isKindOfClass:[UINavigationController class]]) { + UINavigationController *navigationController = (UINavigationController *)controller; + return navigationController.topViewController.supportedInterfaceOrientations; + } else { + return controller.supportedInterfaceOrientations; + } +} + +- (void)dealloc { + UIButton<CYLPlusButtonSubclassing> *plusButton = CYLExternPlusButton; + if (plusButton.superview && (plusButton.superview == self.tabBar)) { + plusButton.selected = NO; + [plusButton removeFromSuperview]; + } + BOOL isAdded = [self isPlusViewControllerAdded:_viewControllers]; + BOOL hasPlusChildViewController = [self hasPlusChildViewController] && isAdded; + if (isAdded && hasPlusChildViewController && CYLPlusChildViewController.cyl_plusViewControllerEverAdded == YES) { + [CYLPlusChildViewController cyl_setPlusViewControllerEverAdded:NO]; + } + // KVO��������� + if (self.isObservingTabImageViewDefaultOffset) { + [self.tabBar removeObserver:self forKeyPath:@"tabImageViewDefaultOffset"]; + } +} + +#pragma mark - +#pragma mark - public Methods + +- (instancetype)initWithViewControllers:(NSArray<UIViewController *> *)viewControllers tabBarItemsAttributes:(NSArray<NSDictionary *> *)tabBarItemsAttributes { + return [self initWithViewControllers:viewControllers + tabBarItemsAttributes:tabBarItemsAttributes + imageInsets:UIEdgeInsetsZero + titlePositionAdjustment:UIOffsetZero + context:nil]; +} + +- (instancetype)initWithViewControllers:(NSArray<UIViewController *> *)viewControllers + tabBarItemsAttributes:(NSArray<NSDictionary *> *)tabBarItemsAttributes + imageInsets:(UIEdgeInsets)imageInsets + titlePositionAdjustment:(UIOffset)titlePositionAdjustment { + + return [self initWithViewControllers:viewControllers + tabBarItemsAttributes:tabBarItemsAttributes + imageInsets:imageInsets + titlePositionAdjustment:titlePositionAdjustment + context:nil]; +} + +- (instancetype)initWithViewControllers:(NSArray<UIViewController *> *)viewControllers + tabBarItemsAttributes:(NSArray<NSDictionary *> *)tabBarItemsAttributes + imageInsets:(UIEdgeInsets)imageInsets + titlePositionAdjustment:(UIOffset)titlePositionAdjustment + context:(NSString *)context { + if (self = [super init]) { + _imageInsets = imageInsets; + _titlePositionAdjustment = titlePositionAdjustment; + _tabBarItemsAttributes = tabBarItemsAttributes; + self.context = context; + self.viewControllers = viewControllers; + if ([self hasPlusChildViewController]) { + self.delegate = self; + } + } + return self; +} + +- (void)setContext:(NSString *)context { + if (context && context.length > 0) { + _context = [context copy]; + } else { + _context = NSStringFromClass([CYLTabBarController class]); + } + [self.tabBar setValue:_context forKey:@"context"]; +} + ++ (instancetype)tabBarControllerWithViewControllers:(NSArray<UIViewController *> *)viewControllers + tabBarItemsAttributes:(NSArray<NSDictionary *> *)tabBarItemsAttributes + imageInsets:(UIEdgeInsets)imageInsets + titlePositionAdjustment:(UIOffset)titlePositionAdjustment + context:(NSString *)context { + return [[self alloc] initWithViewControllers:viewControllers + tabBarItemsAttributes:tabBarItemsAttributes + imageInsets:imageInsets + titlePositionAdjustment:titlePositionAdjustment + context:context]; +} + ++ (instancetype)tabBarControllerWithViewControllers:(NSArray<UIViewController *> *)viewControllers + tabBarItemsAttributes:(NSArray<NSDictionary *> *)tabBarItemsAttributes + imageInsets:(UIEdgeInsets)imageInsets + titlePositionAdjustment:(UIOffset)titlePositionAdjustment { + return [[self alloc] initWithViewControllers:viewControllers + tabBarItemsAttributes:tabBarItemsAttributes + imageInsets:imageInsets + titlePositionAdjustment:titlePositionAdjustment + context:nil]; +} + ++ (instancetype)tabBarControllerWithViewControllers:(NSArray<UIViewController *> *)viewControllers tabBarItemsAttributes:(NSArray<NSDictionary *> *)tabBarItemsAttributes { + return [self tabBarControllerWithViewControllers:viewControllers + tabBarItemsAttributes:tabBarItemsAttributes + imageInsets:UIEdgeInsetsZero + titlePositionAdjustment:UIOffsetZero]; +} + +- (void)hideTabBadgeBackgroundSeparator { + [self.tabBar layoutIfNeeded]; + self.tabBar.cyl_tabBadgeBackgroundSeparator.alpha = 0; + self.tabBar.barStyle = UIBarStyleBlack; +} + ++ (BOOL)havePlusButton { + if (CYLExternPlusButton) { + return YES; + } + return NO; +} + ++ (NSUInteger)allItemsInTabBarCount { + NSUInteger allItemsInTabBar = CYLTabbarItemsCount; + if ([CYLTabBarController havePlusButton]) { + allItemsInTabBar += 1; + } + return allItemsInTabBar; +} + +- (id<UIApplicationDelegate>)appDelegate { + return [UIApplication sharedApplication].delegate; +} + +- (UIWindow *)rootWindow { + UIWindow *result = nil; + + do { + if ([self.appDelegate respondsToSelector:@selector(window)]) { + result = [self.appDelegate window]; + } + + if (result) { + break; + } + } while (NO); + + return result; +} + +#pragma mark - +#pragma mark - Private Methods + +/** + * ������ KVC ������������ tabBar ������������������������������ + */ +- (void)setUpTabBar { + CYLTabBar *tabBar = [[CYLTabBar alloc] init]; + [self setValue:tabBar forKey:@"tabBar"]; + [tabBar cyl_setTabBarController:self]; +} + +- (BOOL)hasPlusChildViewController { + NSString *context = CYLPlusChildViewController.cyl_context; + BOOL isSameContext = [context isEqualToString:self.context] && (context && self.context); // || (!context && !self.context); + BOOL hasPlusChildViewController = CYLPlusChildViewController && isSameContext;//&& !isAdded; + return hasPlusChildViewController; +} + +- (BOOL)isPlusViewControllerAdded:(NSArray *)viewControllers { + if ([_viewControllers containsObject:CYLPlusChildViewController]) { + return YES; + } + __block BOOL isAdded = NO; + [_viewControllers enumerateObjectsUsingBlock:^(UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([self isEqualViewController:obj compairedViewController:CYLPlusChildViewController]) { + isAdded = YES; + *stop = YES; + return; + } + }]; + return isAdded;; +} + +- (void)setViewControllers:(NSArray *)viewControllers { + if (_viewControllers && _viewControllers.count) { + for (UIViewController *viewController in _viewControllers) { + [viewController willMoveToParentViewController:nil]; + [viewController.view removeFromSuperview]; + [viewController removeFromParentViewController]; + } + BOOL isAdded = [self isPlusViewControllerAdded:_viewControllers]; + BOOL hasPlusChildViewController = [self hasPlusChildViewController] && !isAdded; + if (hasPlusChildViewController) { + [CYLPlusChildViewController willMoveToParentViewController:nil]; + [CYLPlusChildViewController.view removeFromSuperview]; + [CYLPlusChildViewController removeFromParentViewController]; + } + } + + if (viewControllers && [viewControllers isKindOfClass:[NSArray class]]) { + if ((!_tabBarItemsAttributes) || (_tabBarItemsAttributes.count != viewControllers.count)) { + [NSException raise:NSStringFromClass([CYLTabBarController class]) format:@"The count of CYLTabBarControllers is not equal to the count of tabBarItemsAttributes.���Chinese���������_tabBarItemsAttributes���������������������������������������������������������������������������`-setViewControllers:`������������"]; + } + //TODO: + BOOL isAdded = [self isPlusViewControllerAdded:_viewControllers]; + BOOL addedFlag = [CYLPlusChildViewController cyl_plusViewControllerEverAdded]; + BOOL hasPlusChildViewController = [self hasPlusChildViewController] && !isAdded && !addedFlag; + if (hasPlusChildViewController) { + NSMutableArray *viewControllersWithPlusButton = [NSMutableArray arrayWithArray:viewControllers]; + [viewControllersWithPlusButton insertObject:CYLPlusChildViewController atIndex:CYLPlusButtonIndex]; + _viewControllers = [viewControllersWithPlusButton copy]; + [CYLPlusChildViewController cyl_setPlusViewControllerEverAdded:YES]; + } else { + _viewControllers = [viewControllers copy]; + } + CYLTabbarItemsCount = [viewControllers count]; + CYLTabBarItemWidth = ([UIScreen mainScreen].bounds.size.width - CYLPlusButtonWidth) / (CYLTabbarItemsCount); + NSUInteger idx = 0; + for (UIViewController *viewController in _viewControllers) { + NSString *title = nil; + id normalImageInfo = nil; + id selectedImageInfo = nil; + UIOffset titlePositionAdjustment = UIOffsetZero; + UIEdgeInsets imageInsets = UIEdgeInsetsZero; + if (viewController != CYLPlusChildViewController) { + title = _tabBarItemsAttributes[idx][CYLTabBarItemTitle]; + normalImageInfo = _tabBarItemsAttributes[idx][CYLTabBarItemImage]; + selectedImageInfo = _tabBarItemsAttributes[idx][CYLTabBarItemSelectedImage]; + + NSValue *offsetValue = _tabBarItemsAttributes[idx][CYLTabBarItemTitlePositionAdjustment]; + UIOffset offset = [offsetValue UIOffsetValue]; + titlePositionAdjustment = offset; + + NSValue *insetsValue = _tabBarItemsAttributes[idx][CYLTabBarItemImageInsets]; + UIEdgeInsets insets = [insetsValue UIEdgeInsetsValue]; + imageInsets = insets; + } else { + idx--; + } + + [self addOneChildViewController:viewController + WithTitle:title + normalImageInfo:normalImageInfo + selectedImageInfo:selectedImageInfo + titlePositionAdjustment:titlePositionAdjustment + imageInsets:imageInsets + + ]; + [[viewController cyl_getViewControllerInsteadOfNavigationController] cyl_setTabBarController:self]; + idx++; + } + } else { + for (UIViewController *viewController in _viewControllers) { + [[viewController cyl_getViewControllerInsteadOfNavigationController] cyl_setTabBarController:nil]; + } + _viewControllers = nil; + } +} + +- (void)setTintColor:(UIColor *)tintColor { + if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.f) { + [self.tabBar setSelectedImageTintColor:tintColor]; + } + self.tabBar.tintColor = tintColor; +} + +/** + * ������������������������ + * + * @param viewController ��������� + * @param title ������ + * @param normalImageInfo ������ + * @param selectedImageInfo ������������ + */ +- (void)addOneChildViewController:(UIViewController *)viewController + WithTitle:(NSString *)title + normalImageInfo:(id)normalImageInfo + selectedImageInfo:(id)selectedImageInfo + titlePositionAdjustment:(UIOffset)titlePositionAdjustment + imageInsets:(UIEdgeInsets)imageInsets +{ + viewController.tabBarItem.title = title; + if (normalImageInfo) { + UIImage *normalImage = [self getImageFromImageInfo:normalImageInfo]; + viewController.tabBarItem.image = normalImage; + } + if (selectedImageInfo) { + UIImage *selectedImage = [self getImageFromImageInfo:selectedImageInfo]; + viewController.tabBarItem.selectedImage = selectedImage; + } + if (self.shouldCustomizeImageInsets || ([self isNOTEmptyForImageInsets:imageInsets])) { + UIEdgeInsets insets = (([self isNOTEmptyForImageInsets:imageInsets]) ? imageInsets : self.imageInsets); + viewController.tabBarItem.imageInsets = insets; + } + if (self.shouldCustomizeTitlePositionAdjustment || [self isNOTEmptyForTitlePositionAdjustment:titlePositionAdjustment]) { + UIOffset offset = (([self isNOTEmptyForTitlePositionAdjustment:titlePositionAdjustment]) ? titlePositionAdjustment : self.titlePositionAdjustment); + viewController.tabBarItem.titlePositionAdjustment = offset; + } + [self addChildViewController:viewController]; +} + +- (UIImage *)getImageFromImageInfo:(id)imageInfo { + UIImage *image = nil; + if ([imageInfo isKindOfClass:[NSString class]]) { + image = [UIImage imageNamed:imageInfo]; + image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; + } else if ([imageInfo isKindOfClass:[UIImage class]]) { + image = (UIImage *)imageInfo; + } + return image; +} + +- (BOOL)shouldCustomizeImageInsets { + BOOL shouldCustomizeImageInsets = [self isNOTEmptyForImageInsets:self.imageInsets]; + return shouldCustomizeImageInsets; +} + +- (BOOL)shouldCustomizeTitlePositionAdjustment { + BOOL shouldCustomizeTitlePositionAdjustment = [self isNOTEmptyForTitlePositionAdjustment:self.titlePositionAdjustment]; + return shouldCustomizeTitlePositionAdjustment; +} + +- (BOOL)isNOTEmptyForImageInsets:(UIEdgeInsets)imageInsets { + if (imageInsets.top != 0 || imageInsets.left != 0 || imageInsets.bottom != 0 || imageInsets.right != 0) { + return YES; + } + return NO; +} + +- (BOOL)isNOTEmptyForTitlePositionAdjustment:(UIOffset)titlePositionAdjustment { + if (titlePositionAdjustment.horizontal != 0 || titlePositionAdjustment.vertical != 0) { + return YES; + } + return NO; +} + +#pragma mark - +#pragma mark - KVO Method + +// KVO������������ +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if(context != CYLTabImageViewDefaultOffsetContext) { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + return; + } + if(context == CYLTabImageViewDefaultOffsetContext) { + CGFloat tabImageViewDefaultOffset = [change[NSKeyValueChangeNewKey] floatValue]; + [self offsetTabBarTabImageViewToFit:tabImageViewDefaultOffset]; + } +} + +- (void)offsetTabBarTabImageViewToFit:(CGFloat)tabImageViewDefaultOffset { + if (self.shouldCustomizeImageInsets) { + return; + } + NSArray<UITabBarItem *> *tabBarItems = self.tabBar.items; + [tabBarItems enumerateObjectsUsingBlock:^(UITabBarItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + UIEdgeInsets imageInset = UIEdgeInsetsMake(tabImageViewDefaultOffset, 0, -tabImageViewDefaultOffset, 0); + obj.imageInsets = imageInset; + if (!self.shouldCustomizeTitlePositionAdjustment) { + obj.titlePositionAdjustment = UIOffsetMake(0, MAXFLOAT); + } + }]; +} + +#pragma mark - delegate + +- (void)updateSelectionStatusIfNeededForTabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { + UIButton *plusButton = CYLExternPlusButton; + CYLTabBarController *tabBarViewController = [[CYLPlusChildViewController cyl_getViewControllerInsteadOfNavigationController] cyl_tabBarController]; + NSArray *viewControllers = tabBarViewController.viewControllers; + BOOL isAdded = [self isPlusViewControllerAdded:viewControllers]; + BOOL hasPlusChildViewController = isAdded; + BOOL isNotCurrentViewController = ![self isEqualViewController:viewController compairedViewController:CYLPlusChildViewController]; + BOOL shouldConfigureSelectionStatus = (hasPlusChildViewController && isNotCurrentViewController); + if (shouldConfigureSelectionStatus) { + plusButton.selected = NO; + } +} + +- (BOOL)isEqualViewController:(UIViewController *)viewController compairedViewController:(UIViewController *)compairedViewController { + if ([viewController isEqual:compairedViewController]) { + return YES; + } + if ([[viewController cyl_getViewControllerInsteadOfNavigationController] isEqual:[compairedViewController cyl_getViewControllerInsteadOfNavigationController]]) { + return YES; + } + return NO; +} + +- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { + [self updateSelectionStatusIfNeededForTabBarController:tabBarController shouldSelectViewController:viewController]; + return YES; +} + +- (void)tabBarController:(UITabBarController *)tabBarController didSelectControl:(UIControl *)control { +} + +- (void)didSelectControl:(UIControl *)control { + SEL actin = @selector(tabBarController:didSelectControl:); + if ([self.delegate respondsToSelector:actin]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [self.delegate performSelector:actin withObject:self withObject:control]; +#pragma clang diagnostic pop + } +} + +- (id)rootViewController { + CYLTabBarController *tabBarController = nil; + id<UIApplicationDelegate> delegate = ((id<UIApplicationDelegate>)[[UIApplication sharedApplication] delegate]); + UIWindow *window = delegate.window; + UIViewController *rootViewController = [window.rootViewController cyl_getViewControllerInsteadOfNavigationController];; + if ([rootViewController isKindOfClass:[CYLTabBarController class]]) { + tabBarController = (CYLTabBarController *)rootViewController; + } + return tabBarController; +} + +@end + +@implementation NSObject (CYLTabBarControllerReferenceExtension) + +- (void)cyl_setTabBarController:(CYLTabBarController *)tabBarController { + //OBJC_ASSOCIATION_ASSIGN instead of OBJC_ASSOCIATION_RETAIN_NONATOMIC to avoid retain circle + id __weak weakObject = tabBarController; + id (^block)() = ^{ return weakObject; }; + objc_setAssociatedObject(self, @selector(cyl_tabBarController), + block, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (CYLTabBarController *)cyl_tabBarController { + CYLTabBarController *tabBarController; + id (^block)() = objc_getAssociatedObject(self, @selector(cyl_tabBarController)); + tabBarController = (block ? block() : nil); + if (tabBarController && [tabBarController isKindOfClass:[CYLTabBarController class]]) { + return tabBarController; + } + if ([self isKindOfClass:[UIViewController class]] && [(UIViewController *)self parentViewController]) { + tabBarController = [[(UIViewController *)self parentViewController] cyl_tabBarController]; + if ([tabBarController isKindOfClass:[CYLTabBarController class]]) { + return tabBarController; + } + } + id<UIApplicationDelegate> delegate = ((id<UIApplicationDelegate>)[[UIApplication sharedApplication] delegate]); + UIWindow *window = delegate.window; + UIViewController *rootViewController = [window.rootViewController cyl_getViewControllerInsteadOfNavigationController];; + if ([rootViewController isKindOfClass:[CYLTabBarController class]]) { + tabBarController = (CYLTabBarController *)rootViewController; + } + return tabBarController; +} + +@end -- Gitblit v1.8.0