BBAMultiTabBar.h
6.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
//
// BBAMultiTabBar.h
// BBAPods-BBAUIKit
//
// Created by Yunpeng Li on 2017/10/9.
// Copyright © 2017年 Baidu. All rights reserved.
//
#import <BBAFoundation/BBAFoundation.h>
#import <UIKit/UIKit.h>
#import "BBAMultiTabItem.h"
#import "BBAMultiTabBarButtonItem.h"
#import "BBAMultiTabBarDefine.h"
typedef NS_ENUM(NSUInteger, BBAMultiTabBarSelectType) {
BBAMultiTabBarSelectTypeDefault = 0, // 默认选中(含reload选中)
BBAMultiTabBarSelectTypeClick, // 点击选中
BBAMultiTabBarSelectTypeSlide, // 滑动选中
BBAMultiTabBarSelectTypeExternal, // 外界设置选中
};
//tab的样式
typedef NS_ENUM(NSUInteger, BBAMultiTabStyle) {
BBAMultiTabStyleDefault,
BBAMultiTabStyleImmersive,//沉浸式样式
};
@class BBAMultiTabBar;
@class BBAMultiTabBarButtonItem;
@protocol BBAMultiTabBarDelegate<NSObject>
@optional
- (BOOL)multiTabBar:(BBAMultiTabBar *)multiTabBar respondsToClickAtIndex:(NSUInteger)index;
- (void)multiTabBar:(BBAMultiTabBar *)multiTabBar didSelectItemAtIndex:(NSUInteger)index type:(BBAMultiTabBarSelectType)type;
- (void)multiTabBar:(BBAMultiTabBar *)multiTabBar itemFirstDisplayAtIndex:(NSUInteger)index;
- (void)multiTabBar:(BBAMultiTabBar *)multiTabBar rightButtonItemDidClickAtIndex:(NSUInteger)index;
- (void)multiTabBarWillBeginDragging:(BBAMultiTabBar *)multiTabBar;
- (void)multiTabBarDidEndDragging:(BBAMultiTabBar *)multiTabBar willDecelerate:(BOOL)decelerate;
- (void)multiTabBarWillBeginDecelerating:(BBAMultiTabBar *)multiTabBar;
- (void)multiTabBarDidEndDecelerating:(BBAMultiTabBar *)multiTabBar;
- (void)multiTabBarDidScroll:(BBAMultiTabBar *)multiTabBar;
///【lPM 刘烨】推荐置顶需求
- (BBAMultiTabItem * _Nullable)multiTabBarFixedItem;
@end
@interface BBAMultiTabBar : UIView
@property (nonatomic, weak) id<BBAMultiTabBarDelegate> delegate;
@property (nonatomic, copy) NSArray<BBAMultiTabItem *> *items;
@property (nonatomic, assign) UIEdgeInsets scrollViewPadding;
/// 若水平居中,则scrollViewPadding设置失效
@property (nonatomic, assign) BOOL horizontalCenter;
/// 当前选中的index,改变时默认会有动画
@property (nonatomic, assign) NSUInteger selectedIndex;
- (void)setSelectedIndex:(NSUInteger)index animated:(BOOL)animated;
- (void)setSelectedIndex:(NSUInteger)index animated:(BOOL)animated completion:(void (^)(BOOL success))completion;
/// 初始化时,默认选中的index
@property (nonatomic, assign) NSUInteger defaultSelectedIndex;
/// 滑动进度[0, self.items.count]
@property (nonatomic, assign) CGFloat slidingProgress;
/// 以最大宽度水平平均匀分布
@property (nonatomic, assign, getter=isDistributedHorizontaly) BOOL distributedHorizontaly;
/// 请勿切换scrllView的delegate
@property (nonatomic, strong, readonly) UIScrollView *scrollView;
/// items之间的水平间距
@property (nonatomic, assign) CGFloat horizontalSpace;
// 右侧操作区的padding
@property (nonatomic, assign) UIEdgeInsets rightBarButtonAreaPadding;
/// 右侧按钮item的间距
@property (nonatomic, assign) CGFloat rightBarButtonItemSpace;
/// 右侧的按钮,使用方式和NavigationBar的rightBarButtonItem(s)一样
@property (nonatomic, strong) BBAMultiTabBarButtonItem *rightBarButtonItem;
/// !!!与NavigationBar的机制相同,rightBarButtonItems的顺序是从右往左添加的!!!
@property (nonatomic, copy) NSArray<BBAMultiTabBarButtonItem *> *rightBarButtonItems;
@property (nonatomic, strong) UIView *topSeparatorLineView;
@property (nonatomic, strong) UIView *bottomSeparatorLineView;
@property (nonatomic, assign) BBAMultiTabStyle multiTabStyle; //tab的样式
/// 右侧button分隔线
@property (nonatomic, strong) NSMutableArray<UIView *> *rightButtonSeparatorLines;
/// 底部选中条
@property (nonatomic, strong) UIView *selectionIndicator;
/// 底部选中条 宽度 d20新增
@property (nonatomic, assign) CGFloat indicatorWidth;
/// 底部选中条 高度 d20新增
@property (nonatomic, assign) CGFloat indicatorHeight;
/// 底部分割线左右间距
@property (nonatomic, assign) UIEdgeInsets bottomLineEdgeInsets;
/// 点击选中时是否有动画
@property (nonatomic, assign) BOOL selectScaleAnimation;
/// 隐藏两侧渐隐渐现的效果
@property (nonatomic, assign) BOOL hideFadeEffect;
/// 当存在的时候布局为scrollview嵌套滑动,如果为nil走原有逻辑
@property (nonatomic, strong, readonly) BBAMultiTabItem * _Nullable fixedItem;
// 当有fixedItem时候用到block,用于滑动了5pt做一些操作,目前是展示编辑tab页
@property (nonatomic, copy) void(^ _Nullable scrollDoSomething)(void);
- (void)reloadData;
- (void)updateUI;
/// 当布局变化后,更新右侧按钮
- (void)updateRightBarButtonItems;
/// 滑动至某个index,但不会触发选中,默认有动画
- (void)scrollToIndex:(NSUInteger)index;
- (void)scrollToIndex:(NSUInteger)index animated:(BOOL)animated;
- (void)scrollToIndex:(NSUInteger)index animated:(BOOL)animated completion:(void (^)(BOOL success))completion;
- (void)foldAnimateWithDuration:(NSTimeInterval)time;
- (void)unfoldAnimateWithDuration:(NSTimeInterval)time;
/// 展开右侧按钮动画
/// @param time 动画时间
/// @param willAniamtionBlock 每个item将要执行渐显
/// @param animatingBlock 正在执行渐显
/// @param didAniamtionBlock 提交渐显动画
/// @param contentFinish 容器大小改变动画执行或者结束
- (void)unfoldWithoutScrollWithTime:(NSTimeInterval)time
itemWillAnimationBlock:(void(^_Nullable)(BBAMultiTabBarButtonItem * _Nullable item))willAniamtionBlock
itemAnimatingBlock:(void(^_Nullable)(BBAMultiTabBarButtonItem * _Nullable item))animatingBlock
itemDidAmimationBlock:(void(^_Nullable)(BBAMultiTabBarButtonItem * _Nullable item))didAniamtionBlock;
- (void)updateBarButtonItems:(NSArray<BBAMultiTabBarButtonItem *> *)rightBarButtonItems;
//12.8固定item实验需要改变滑动后的位置
- (void)updateTargetPercentage:(CGFloat)targetPercentage;
//12.8固定item更新箭头
- (void)updateInsetViewImage:(UIImage * _Nullable)image;
- (void)configscrollRightInsetViewWithImage:(UIImage * _Nullable)image doSomething:(void(^_Nullable)(void))block;
- (void)resetTipsColor:(UIColor *)color;
/// 固定item实验中会有滑动到最后执行外部操作,目前是打开tab编辑页,只有在命中实验时候才生效,未命中实验不会设置是否禁止滑动
- (void)multiTabScrollViewScrollEnable:(BOOL)enable;
@end
@interface UIScrollView(BBAMultiTabBar)
@property (nonatomic, assign) BOOL canMultiSliding;
- (BOOL)bba_shouldTriggerSlidingProgress;
@end
@interface UIColor(BBAMultiTabBar)
+ (UIColor *)bba_colorTransformWithSourceColor:(UIColor *)sourceColor targetColor:(UIColor *)targetColor progress:(CGFloat)progress;
@end