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/CYLTabBar.m | 414 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 414 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/CYLTabBarController/CYLTabBarController/CYLTabBar.m b/screendisplay/Pods/CYLTabBarController/CYLTabBarController/CYLTabBar.m new file mode 100644 index 0000000..e350690 --- /dev/null +++ b/screendisplay/Pods/CYLTabBarController/CYLTabBarController/CYLTabBar.m @@ -0,0 +1,414 @@ +// +// CYLTabBar.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 "CYLTabBar.h" +#import "CYLPlusButton.h" +#import "CYLTabBarController.h" +#import "CYLConstants.h" + +static void *const CYLTabBarContext = (void*)&CYLTabBarContext; + +@interface CYLTabBar () + +/** ������������ */ +@property (nonatomic, strong) UIButton<CYLPlusButtonSubclassing> *plusButton; +@property (nonatomic, assign) CGFloat tabBarItemWidth; +@property (nonatomic, copy) NSArray *tabBarButtonArray; +@property (nonatomic, assign, getter=hasAddPlusButton) BOOL addPlusButton; + +@end + +@implementation CYLTabBar +@synthesize plusButton = _plusButton; + +#pragma mark - +#pragma mark - LifeCycle Method + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + self = [self sharedInit]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + self = [self sharedInit]; + } + return self; +} + +- (void)setPlusButton:(UIButton<CYLPlusButtonSubclassing> *)plusButton { + if (!plusButton) { + return; + } + _plusButton = plusButton; + if (!self.hasAddPlusButton) { + + NSString *tabBarContext = self.tabBarContext; + BOOL isFirstAdded = (_plusButton.superview == nil); + + BOOL isSameContext = [tabBarContext isEqualToString:self.context] && (tabBarContext && self.context); + if (_plusButton && isSameContext && isFirstAdded) { + [self addSubview:(UIButton *)_plusButton]; + [_plusButton cyl_setTabBarController: [self cyl_tabBarController]]; + } + self.addPlusButton = YES; + } +} + +- (void)setContext:(NSString *)context { + _context = context; + self.plusButton = CYLExternPlusButton; +} + +- (instancetype)sharedInit { + // KVO������������ + _tabBarItemWidth = CYLTabBarItemWidth; + [self addObserver:self forKeyPath:@"tabBarItemWidth" options:NSKeyValueObservingOptionNew context:CYLTabBarContext]; + return self; +} + +- (CGSize)sizeThatFits:(CGSize)size { + CGSize sizeThatFits = [super sizeThatFits:size]; + CGFloat height = [self cyl_tabBarController].tabBarHeight; + if (height > 0) { + sizeThatFits.height = [self cyl_tabBarController].tabBarHeight; + } + return sizeThatFits; +} + +/** + * lazy load tabBarButtonArray + * + * @return NSArray + */ +- (NSArray *)tabBarButtonArray { + if (_tabBarButtonArray == nil) { + _tabBarButtonArray = @[]; + } + return _tabBarButtonArray; +} + +- (NSString *)tabBarContext { + NSString *tabBarContext; + if ([[_plusButton class] respondsToSelector:@selector(tabBarContext)]) { + tabBarContext = [[_plusButton class] tabBarContext]; + } + if (tabBarContext && tabBarContext.length > 0) { + return tabBarContext; + } + tabBarContext = NSStringFromClass([CYLTabBarController class]); + return tabBarContext; +} + +- (UIButton<CYLPlusButtonSubclassing> *)plusButton { + if (!CYLExternPlusButton || !_plusButton) { + return nil; + } + NSString *tabBarContext = self.tabBarContext; + BOOL addedToTabBar = [_plusButton.superview isEqual:self]; + BOOL isSameContext = [tabBarContext isEqualToString:self.context] && (tabBarContext && self.context);;//|| (!tabBarContext && !self.context); + if (_plusButton && addedToTabBar && isSameContext) { + return _plusButton; + } + + return nil; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + NSArray *sortedSubviews = [self sortedSubviews]; + self.tabBarButtonArray = [self tabBarButtonFromTabBarSubviews:sortedSubviews]; + if (self.tabBarButtonArray.count == 0) { + return; + } + [self setupTabImageViewDefaultOffset:self.tabBarButtonArray[0]]; + CGFloat tabBarWidth = self.bounds.size.width; + CGFloat tabBarHeight = self.bounds.size.height; + + if (!CYLExternPlusButton) { + return; + } + BOOL addedToTabBar = [_plusButton.superview isEqual:self]; + if (!addedToTabBar) { + CYLTabBarItemWidth = (tabBarWidth) / CYLTabbarItemsCount; + [self.tabBarButtonArray enumerateObjectsUsingBlock:^(UIView * _Nonnull childView, NSUInteger buttonIndex, BOOL * _Nonnull stop) { + //���������childView���x���������,yh��������� + CGFloat childViewX = buttonIndex * CYLTabBarItemWidth; + [self changeXForChildView:childView childViewX:childViewX tabBarItemWidth:CYLTabBarItemWidth]; + }]; + + } else { + CYLTabBarItemWidth = (tabBarWidth - CYLPlusButtonWidth) / CYLTabbarItemsCount; + CGFloat multiplierOfTabBarHeight = [self multiplierOfTabBarHeight:tabBarHeight]; + CGFloat constantOfPlusButtonCenterYOffset = [self constantOfPlusButtonCenterYOffsetForTabBarHeight:tabBarHeight]; + _plusButton.center = CGPointMake(tabBarWidth * 0.5, tabBarHeight * multiplierOfTabBarHeight + constantOfPlusButtonCenterYOffset); + NSUInteger plusButtonIndex = [self plusButtonIndex]; + [self.tabBarButtonArray enumerateObjectsUsingBlock:^(UIView * _Nonnull childView, NSUInteger buttonIndex, BOOL * _Nonnull stop) { + //������UITabBarItem��������� + CGFloat childViewX; + if ([self hasPlusChildViewController]) { + if (buttonIndex <= plusButtonIndex) { + childViewX = buttonIndex * CYLTabBarItemWidth; + } else { + childViewX = (buttonIndex - 1) * CYLTabBarItemWidth + CYLPlusButtonWidth; + } + } else { + if (buttonIndex >= plusButtonIndex) { + childViewX = buttonIndex * CYLTabBarItemWidth + CYLPlusButtonWidth; + } else { + childViewX = buttonIndex * CYLTabBarItemWidth; + } + } + //���������childView���x���������,yh��������� + [self changeXForChildView:childView childViewX:childViewX tabBarItemWidth:CYLTabBarItemWidth]; + }]; + //bring the plus button to top + [self bringSubviewToFront:_plusButton]; + } + + self.tabBarItemWidth = CYLTabBarItemWidth; +} + +- (void)changeXForChildView:(UIView *)childView childViewX:(CGFloat)childViewX tabBarItemWidth:(CGFloat)tabBarItemWidth { + //���������childView���x���������,yh��������� + childView.frame = CGRectMake(childViewX, + CGRectGetMinY(childView.frame), + tabBarItemWidth, + CGRectGetHeight(childView.frame) + ); +} + +#pragma mark - +#pragma mark - Private Methods + ++ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key { + return NO; +} + +// KVO������������ +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if(context != CYLTabBarContext) { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + return; + } + if(context == CYLTabBarContext) { + [[NSNotificationCenter defaultCenter] postNotificationName:CYLTabBarItemWidthDidChangeNotification object:self]; + if (CYL_IS_IPHONE_X) { + [self layoutIfNeeded]; + } + } +} + + +- (void)dealloc { + // KVO��������� + [self removeObserver:self forKeyPath:@"tabBarItemWidth"]; +} + +- (void)setTabBarItemWidth:(CGFloat )tabBarItemWidth { + if (_tabBarItemWidth != tabBarItemWidth) { + [self willChangeValueForKey:@"tabBarItemWidth"]; + _tabBarItemWidth = tabBarItemWidth; + [self didChangeValueForKey:@"tabBarItemWidth"]; + } +} + +- (void)setTabImageViewDefaultOffset:(CGFloat)tabImageViewDefaultOffset { + if (tabImageViewDefaultOffset != 0.f) { + [self willChangeValueForKey:@"tabImageViewDefaultOffset"]; + _tabImageViewDefaultOffset = tabImageViewDefaultOffset; + [self didChangeValueForKey:@"tabImageViewDefaultOffset"]; + } +} + +- (CGFloat)multiplierOfTabBarHeight:(CGFloat)tabBarHeight { + CGFloat multiplierOfTabBarHeight; + if ([[self.plusButton class] respondsToSelector:@selector(multiplierOfTabBarHeight:)]) { + multiplierOfTabBarHeight = [[self.plusButton class] multiplierOfTabBarHeight:tabBarHeight]; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + else if ([[self.plusButton class] respondsToSelector:@selector(multiplerInCenterY)]) { + multiplierOfTabBarHeight = [[self.plusButton class] multiplerInCenterY]; + } +#pragma clang diagnostic pop + + else { + CGSize sizeOfPlusButton = self.plusButton.frame.size; + CGFloat heightDifference = sizeOfPlusButton.height - self.bounds.size.height; + if (heightDifference < 0) { + multiplierOfTabBarHeight = 0.5; + } else { + CGPoint center = CGPointMake(self.bounds.size.height * 0.5, self.bounds.size.height * 0.5); + center.y = center.y - heightDifference * 0.5; + multiplierOfTabBarHeight = center.y / self.bounds.size.height; + } + } + return multiplierOfTabBarHeight; +} + +- (CGFloat)constantOfPlusButtonCenterYOffsetForTabBarHeight:(CGFloat)tabBarHeight { + CGFloat constantOfPlusButtonCenterYOffset = 0.f; + if ([[self.plusButton class] respondsToSelector:@selector(constantOfPlusButtonCenterYOffsetForTabBarHeight:)]) { + constantOfPlusButtonCenterYOffset = [[self.plusButton class] constantOfPlusButtonCenterYOffsetForTabBarHeight:tabBarHeight]; + } + return constantOfPlusButtonCenterYOffset; +} + +- (NSUInteger)plusButtonIndex { + NSUInteger plusButtonIndex; + if ([[self.plusButton class] respondsToSelector:@selector(indexOfPlusButtonInTabBar)]) { + plusButtonIndex = [[self.plusButton class] indexOfPlusButtonInTabBar]; + CGFloat childViewX = plusButtonIndex * CYLTabBarItemWidth; + CGFloat tabBarItemWidth = CGRectGetWidth(self.plusButton.frame); + [self changeXForChildView:self.plusButton childViewX:childViewX tabBarItemWidth:tabBarItemWidth]; + } else { + if (CYLTabbarItemsCount % 2 != 0) { + [NSException raise:NSStringFromClass([CYLTabBarController class]) format:@"If the count of CYLTabbarControllers is odd,you must realizse `+indexOfPlusButtonInTabBar` in your custom plusButton class.���Chinese���������CYLTabbarControllers������������������������������������������������plusButton���������`+indexOfPlusButtonInTabBar`������������plusButton���������"]; + } + plusButtonIndex = CYLTabbarItemsCount * 0.5; + } + CYLPlusButtonIndex = plusButtonIndex; + return plusButtonIndex; +} + +/*! + * Deal with some trickiness by Apple, You do not need to understand this method, somehow, it works. + * NOTE: If the `self.title of ViewController` and `the correct title of tabBarItemsAttributes` are different, Apple will delete the correct tabBarItem from subViews, and then trigger `-layoutSubviews`, therefore subViews will be in disorder. So we need to rearrange them. + */ +- (NSArray *)sortedSubviews { + if (self.subviews.count == 0) { + return self.subviews; + } + NSMutableArray *tabBarButtonArray = [NSMutableArray arrayWithCapacity:self.subviews.count]; + [self.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj cyl_isTabButton]) { + [tabBarButtonArray addObject:obj]; + } + }]; + + NSArray *sortedSubviews = [[tabBarButtonArray copy] sortedArrayUsingComparator:^NSComparisonResult(UIView * formerView, UIView * latterView) { + CGFloat formerViewX = formerView.frame.origin.x; + CGFloat latterViewX = latterView.frame.origin.x; + return (formerViewX > latterViewX) ? NSOrderedDescending : NSOrderedAscending; + }]; + return sortedSubviews; +} + +- (NSArray *)tabBarButtonFromTabBarSubviews:(NSArray *)tabBarSubviews { + if (tabBarSubviews.count == 0) { + return tabBarSubviews; + } + NSMutableArray *tabBarButtonMutableArray = [NSMutableArray arrayWithCapacity:tabBarSubviews.count]; + [tabBarSubviews enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj cyl_isTabButton]) { + [tabBarButtonMutableArray addObject:obj]; + } + }]; + if ([self hasPlusChildViewController]) { + @try { + UIControl *control = tabBarButtonMutableArray[CYLPlusButtonIndex]; + control.userInteractionEnabled = NO; + control.hidden = YES; + } @catch (NSException *exception) {} + } + return [tabBarButtonMutableArray copy]; +} + +- (BOOL)hasPlusChildViewController { + NSString *context = CYLPlusChildViewController.cyl_context; + BOOL isSameContext = [context isEqualToString:self.context] && (context && self.context); + BOOL isAdded = [[self cyl_tabBarController].viewControllers containsObject:CYLPlusChildViewController]; + if (CYLPlusChildViewController && isSameContext && isAdded) { + return YES; + } + return NO; +} + +- (void)setupTabImageViewDefaultOffset:(UIView *)tabBarButton { + __block BOOL shouldCustomizeImageView = YES; + __block CGFloat tabImageViewHeight = 0.f; + __block CGFloat tabImageViewDefaultOffset = 0.f; + CGFloat tabBarHeight = self.frame.size.height; + [tabBarButton.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj cyl_isTabLabel]) { + shouldCustomizeImageView = NO; + } + tabImageViewHeight = obj.frame.size.height; + BOOL isTabImageView = [obj cyl_isTabImageView]; + if (isTabImageView) { + tabImageViewDefaultOffset = (tabBarHeight - tabImageViewHeight) * 0.5 * 0.5; + } + if (isTabImageView && tabImageViewDefaultOffset == 0.f) { + shouldCustomizeImageView = NO; + } + }]; + if (shouldCustomizeImageView) { + self.tabImageViewDefaultOffset = tabImageViewDefaultOffset; + } +} + +/*! + * Capturing touches on a subview outside the frame of its superview. + */ +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + //1. ��������������������������������������� + BOOL canNotResponseEvent = self.hidden || (self.alpha <= 0.01f) || (self.userInteractionEnabled == NO); + if (canNotResponseEvent) { + return nil; + } + + //2. ������������ PlusButton ���������������������������������TabBarItems ������������������ + //��������������������������������������� TabBarItems ������������ + // 2.1���������clipsToBounds������������view������������������������������ + if (self.clipsToBounds && ![self pointInside:point withEvent:event]) { + return nil; + } + + if (self.plusButton) { + CGRect plusButtonFrame = self.plusButton.frame; + BOOL isInPlusButtonFrame = CGRectContainsPoint(plusButtonFrame, point); + if (isInPlusButtonFrame) { + return self.plusButton; + } + } + NSArray *tabBarButtons = self.tabBarButtonArray; + if (self.tabBarButtonArray.count == 0) { + tabBarButtons = [self tabBarButtonFromTabBarSubviews:self.subviews]; + } + for (NSUInteger index = 0; index < tabBarButtons.count; index++) { + UIView *selectedTabBarButton = tabBarButtons[index]; + CGRect selectedTabBarButtonFrame = selectedTabBarButton.frame; + BOOL isTabBarButtonFrame = CGRectContainsPoint(selectedTabBarButtonFrame, point); + if (isTabBarButtonFrame) { + return selectedTabBarButton; + } + } + + //3. ������������ TabBarItems ��������������������������� TabBar ��������������������������������� TabBar ������������������ + UIView *result = [super hitTest:point withEvent:event]; + if (result) { + return result; + } + + for (UIView *subview in self.subviews.reverseObjectEnumerator) { + CGPoint subPoint = [subview convertPoint:point fromView:self]; + result = [subview hitTest:subPoint withEvent:event]; + if (result) { + return result; + } + } + return nil; +} + +@end -- Gitblit v1.8.0