New file |
| | |
| | | // |
| | | // CYLPlusButton.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 "CYLPlusButton.h" |
| | | #import "CYLTabBarController.h" |
| | | #import "UIViewController+CYLTabBarControllerExtention.h" |
| | | |
| | | CGFloat CYLPlusButtonWidth = 0.0f; |
| | | UIButton<CYLPlusButtonSubclassing> *CYLExternPlusButton = nil; |
| | | UIViewController *CYLPlusChildViewController = nil; |
| | | |
| | | @implementation CYLPlusButton |
| | | |
| | | #pragma mark - |
| | | #pragma mark - public Methods |
| | | |
| | | + (void)registerPlusButton { |
| | | if (![self conformsToProtocol:@protocol(CYLPlusButtonSubclassing)]) { |
| | | return; |
| | | } |
| | | Class<CYLPlusButtonSubclassing> class = self; |
| | | UIButton<CYLPlusButtonSubclassing> *plusButton = [class plusButton]; |
| | | CYLExternPlusButton = plusButton; |
| | | CYLPlusButtonWidth = plusButton.frame.size.width; |
| | | if ([[self class] respondsToSelector:@selector(plusChildViewController)]) { |
| | | CYLPlusChildViewController = [class plusChildViewController]; |
| | | if ([[self class] respondsToSelector:@selector(tabBarContext)]) { |
| | | NSString *tabBarContext = [class tabBarContext]; |
| | | if (tabBarContext && tabBarContext.length) { |
| | | [CYLPlusChildViewController cyl_setContext:tabBarContext]; |
| | | } |
| | | } else { |
| | | [CYLPlusChildViewController cyl_setContext:NSStringFromClass([CYLTabBarController class])]; |
| | | } |
| | | [[self class] addSelectViewControllerTarget:plusButton]; |
| | | if ([[self class] respondsToSelector:@selector(indexOfPlusButtonInTabBar)]) { |
| | | CYLPlusButtonIndex = [[self class] indexOfPlusButtonInTabBar]; |
| | | } else { |
| | | [NSException raise:NSStringFromClass([CYLTabBarController class]) format:@"If you want to add PlusChildViewController, you must realizse `+indexOfPlusButtonInTabBar` in your custom plusButton class.【Chinese】如果你想使用PlusChildViewController样式,你必须同时在你自定义的plusButton中实现 `+indexOfPlusButtonInTabBar`,来指定plusButton的位置"]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wdeprecated-declarations" |
| | | + (void)registerSubclass { |
| | | [self registerPlusButton]; |
| | | } |
| | | #pragma clang diagnostic pop |
| | | |
| | | - (void)plusChildViewControllerButtonClicked:(UIButton<CYLPlusButtonSubclassing> *)sender { |
| | | BOOL notNeedConfigureSelectionStatus = [[self class] respondsToSelector:@selector(shouldSelectPlusChildViewController)] && ![[self class] shouldSelectPlusChildViewController]; |
| | | if (notNeedConfigureSelectionStatus) { |
| | | return; |
| | | } |
| | | if (sender.selected) { |
| | | return; |
| | | } |
| | | sender.selected = YES; |
| | | CYLTabBarController *tabBarController = [sender cyl_tabBarController]; |
| | | NSInteger index = [tabBarController.viewControllers indexOfObject:CYLPlusChildViewController]; |
| | | @try { |
| | | [tabBarController setSelectedIndex:index]; |
| | | } @catch (NSException *exception) { |
| | | NSLog(@"🔴类名与方法名:%@(在第%@行),描述:%@", @(__PRETTY_FUNCTION__), @(__LINE__), exception); |
| | | } |
| | | } |
| | | |
| | | #pragma mark - |
| | | #pragma mark - Private Methods |
| | | |
| | | + (void)addSelectViewControllerTarget:(UIButton<CYLPlusButtonSubclassing> *)plusButton { |
| | | id target = self; |
| | | NSArray<NSString *> *selectorNamesArray = [plusButton actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; |
| | | if (selectorNamesArray.count == 0) { |
| | | target = plusButton; |
| | | selectorNamesArray = [plusButton actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; |
| | | } |
| | | [selectorNamesArray enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { |
| | | SEL selector = NSSelectorFromString(obj); |
| | | [plusButton removeTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; |
| | | }]; |
| | | [plusButton addTarget:plusButton action:@selector(plusChildViewControllerButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; |
| | | } |
| | | |
| | | /** |
| | | * 按钮选中状态下点击先显示normal状态的颜色,松开时再回到selected状态下颜色。 |
| | | * 重写此方法即不会出现上述情况,与 UITabBarButton 相似 |
| | | */ |
| | | - (void)setHighlighted:(BOOL)highlighted {} |
| | | |
| | | @end |