BBAMultiTabBar.h 6.71 KB
//
//  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