Newer
Older
XinYang_IOS / build / Debug-iphoneos / ZXNavigationBar / ZXNavigationBar.framework / Headers / ZXNavigationBarTableViewController.h
@zhangfeng zhangfeng on 7 Dec 18 KB 1.9.0
//
//  ZXNavigationBarTableViewController.h
//  ZXNavigationBar
//
//  Created by 李兆祥 on 2020/12/31.
//  Copyright © 2020 ZXLee. All rights reserved.
//  https://github.com/SmileZXLee/ZXNavigationBar
//  V1.4.1

#import <UIKit/UIKit.h>
#import "UINavigationController+ZXNavBarAllHiddenExtension.h"
#import "ZXNavigationBarController+ZXNavSystemBarPopHandle.h"
#import "ZXNavigationBar.h"
#import "ZXNavigationBarNavigationController.h"
#import "ZXNavHistoryStackContentView.h"
NS_ASSUME_NONNULL_BEGIN
typedef void(^leftBtnClickedBlock) (ZXNavItemBtn *btn);
typedef void(^subLeftBtnClickedBlock) (ZXNavItemBtn *btn);
typedef void(^rightBtnClickedBlock) (ZXNavItemBtn *btn);
typedef void(^subRightBtnClickedBlock) (ZXNavItemBtn *btn);
typedef void(^foldingOffsetBlock) (CGFloat offset);
typedef void(^foldCompletionBlock) (void);

typedef void(^__nullable transparentGradientsChangingBlock) (CGFloat alpha);
typedef void(^transparentGradientsTransparentBlock) (void);
typedef void(^transparentGradientsOpaqueBlock) (void);

@interface ZXNavigationBarTableViewController : UITableViewController
/**
 设置左右Button的大小(宽高相等)
 */
@property (assign, nonatomic)CGFloat zx_navItemSize;

/**
 设置Item之间的间距
 */
@property (assign, nonatomic)CGFloat zx_navItemMargin;

/**
 状态栏颜色
 */
@property(assign, nonatomic)ZXNavStatusBarStyle zx_navStatusBarStyle;

/**
 是否禁止根据zx_navStatusBarStyle自动调整状态栏颜色,默认为否
 */
@property(assign, nonatomic)BOOL zx_disableAutoSetStatusBarStyle;

/**
 是否隐藏ZXNavigationBar导航栏,默认为否
 */
@property (assign, nonatomic)BOOL zx_hideBaseNavBar;

/**
 是否显示系统导航栏,默认为否
 */
@property (assign, nonatomic)BOOL zx_showSystemNavBar;

/**
 是否开启系统导航栏与自定义导航栏平滑过渡(务必仅当存在系统导航栏与自定义导航栏过渡时启用,非必要请勿启用,否则可能造成自定义导航栏跳动,若当前控制器显示了系统导航栏,请于当前控制器pop的上一个控制器中使用self.zx_navEnableSmoothFromSystemNavBar = YES)
 */
@property (assign, nonatomic)BOOL zx_navEnableSmoothFromSystemNavBar;

/**
 是否禁止Xib加载控制器情况下自动将顶部View约束下移导航栏高度,默认为否(使用Xib加载控制器时生效)
 */
@property (assign, nonatomic)BOOL zx_disableNavAutoSafeLayout;

/**
 是否启用了SafeArea,默认为是,若取消了SafeArea,则必须将此项设置为NO(使用Xib加载控制器时生效)
 */
@property (assign, nonatomic)BOOL zx_isEnableSafeArea ZXNavigationBarDeprecated("从版本1.3.1起,此属性无效,是否启用了SafeArea交由ZXNavigationBar内部自行判断");

/**
 禁止自动设置自定义导航栏与其相关配置,保留原有的系统导航栏(需要设置在[super viewDidLoad]之前)
 */
@property (assign, nonatomic)BOOL zx_disableAutoSetCustomNavBar;

/**
 设置导航栏的TintColor,此属性可以将导航栏的title颜色、左右Button的文字和图片颜色修改为TintColor
 */
@property (strong, nonatomic, nullable)UIColor *zx_navTintColor;

/**
 设置导航栏标题,使用self.title亦可
 */
@property (copy, nonatomic)NSString *zx_navTitle;

/**
 titleView,显示在正中间的标题View,请不要在titleView直接添加自定义的titleView,如需设置自定义导航栏请使用-zx_addCustomTitleView方法
 */
@property (weak, nonatomic, readonly)ZXNavTitleView *zx_navTitleView;

/**
 titleLabel,显示在正中间的标题Label
 */
@property (weak, nonatomic)ZXNavTitleLabel *zx_navTitleLabel;

/**
 设置导航栏标题颜色
 */
@property (strong, nonatomic)UIColor *zx_navTitleColor;

/**
 设置导航栏标题字体大小
 */
@property (assign, nonatomic)CGFloat zx_navTitleFontSize;

/**
 设置导航栏标题字体
 */
@property (strong, nonatomic)UIFont *zx_navTitleFont;

/**
 返回按钮的图片名,若不设置则使用默认的返回按钮图片
 */
@property (copy, nonatomic)NSString *zx_backBtnImageName;

/**
 导航栏分割线View
 */
@property (weak, nonatomic)UIView *zx_navLineView;

/**
 导航栏分割线View背景颜色
 */
@property (strong, nonatomic)UIColor *zx_navLineViewBackgroundColor;

/**
 导航栏分割线的高度,默认为0.5
 */
@property (assign, nonatomic)CGFloat zx_navLineViewHeight;

/**
 最左侧Button
 */
@property (weak, nonatomic)ZXNavItemBtn *zx_navLeftBtn;

/**
 左侧第二个Button
 */
@property (weak, nonatomic)ZXNavItemBtn *zx_navSubLeftBtn;

/**
 最右侧Button
 */
@property (weak, nonatomic)ZXNavItemBtn *zx_navRightBtn;

/**
 右侧第二个Button
 */
@property (weak, nonatomic)ZXNavItemBtn *zx_navSubRightBtn;

/**
 ZXNavigationBar导航栏对象
 */
@property (weak, nonatomic)ZXNavigationBar *zx_navBar;

/**
 设置导航栏背景颜色
 */
@property (strong, nonatomic)UIColor *zx_navBarBackgroundColor;

/**
 设置导航栏背景颜色透明度(与设置为导航栏不同,此设置仅会改变导航栏背景色RGBA中的Alpha值)
 */
@property (assign, nonatomic)CGFloat zx_navBarBackgroundColorAlpha;

/**
 导航栏背景ImageView
 */
@property (weak, nonatomic)ZXNavBacImageView *zx_navBacImageView;

/**
 设置导航栏背景图片
 */
@property (strong, nonatomic, nullable)UIImage *zx_navBarBackgroundImage;

/**
 自定义的导航栏View,是ZXNavigationBar的SubView,如需设置自定义导航栏请使用-zx_addCustomNavBar方法
 */
@property (weak, nonatomic, readonly)UIView *zx_navCustomNavBar;

/**
 自定义的titleView,是TitleView的SubView,如需设置自定义导航栏请使用-zx_addCustomTitleView方法
 */
@property (weak, nonatomic, readonly)UIView *zx_navCustomTitleView;

/**
 导航栏是否已被折叠,默认为否
 */
@property (assign, nonatomic, readonly)BOOL zx_navIsFolded;

/**
 导航栏折叠动画速度
 */
@property (assign, nonatomic, readonly)int zx_navFoldingSpeed;

/**
 是否禁用全屏pop手势,若禁用,则pop触发范围为屏幕宽度的十分之一(导航控制器需为ZXNavigationBarNavigationController或继承于ZXNavigationBarNavigationController)
 */
@property (assign, nonatomic)BOOL zx_disableFullScreenGesture;


/**
 pop手势的触发范围比例,0-1,默认为1,即代表全屏触发(导航控制器需为ZXNavigationBarNavigationController或继承于ZXNavigationBarNavigationController)
 注意:因设置全屏返回手势响应范围与禁用全屏pop手势属于同一导航控制器,为避免此属性被其他子控制器修改,以下代码建议写在子控制器的-viewWillAppear或-viewDidAppear中
 */
@property (assign, nonatomic) CGFloat zx_popGestureCoverRatio;
/**
 将所有约束为top且secondItem为控制器view或safeArea的子view约束constant设置为原始长度+导航栏高度,默认为NO,若设置为YES,将会遍历控制器view中的所有约束,对性能有一点影响(需要设置在[super viewDidLoad]之前)
 */
@property (assign, nonatomic) BOOL zx_enableAdjustNavContainerAll;
/**
 自动将顶部View约束下移导航栏高度时的回调,可拦截并自定义下移距离(xib加载控制器view时生效)
 oldNavOffset:视图在xib中所设置的约束与顶部距离
 currentNavOffset:即将设置的视图与顶部的距离
 */
@property(copy, nonatomic)CGFloat(^zx_handleAdjustNavContainerOffsetBlock)(CGFloat oldNavOffset,CGFloat currentNavOffset);

/**
 拦截点击返回事件和侧滑返回手势,若返回NO,则禁止pop;
 viewController:当前控制器
 popBlockFrom:通过什么方式(点击返回按钮或侧滑返回手势)触发pop操作
 */
@property(copy, nonatomic)BOOL(^zx_handlePopBlock)(ZXNavigationBarTableViewController *viewController,ZXNavPopBlockFrom popBlockFrom);

/**
 监听自定义pop手势进度(导航控制器需为ZXNavigationBarNavigationController或继承于ZXNavigationBarNavigationController)。popOffsetProgress范围为0-1,0代表即将开始pop,1代表完成pop
 注意:因手势进度监听的block属于同一导航控制器,为避免block被子控制器覆盖后失效,以下代码建议写在子控制器的-viewWillAppear或-viewDidAppear中
 */
@property(copy, nonatomic)void(^zx_handleCustomPopGesture)(CGFloat popOffsetProgress);

/**
pop手势是否支持多层级的手势同时触发,默认为否。若设置了此block,zx_setPopGestureCompatibleScrollView与zx_setPopGestureCompatibleScrollViews方法将失效
注意:因判断是否支持多层级的手势同时触发的block属于同一导航控制器,为避免block被子控制器覆盖后失效,以下代码建议写在子控制器的-viewWillAppear或-viewDidAppear中
*/
@property(copy, nonatomic)BOOL(^zx_popGestureShouldRecognizeSimultaneously)(UIGestureRecognizer *otherGestureRecognizer);

/**
 导航栏固定高度
 */
@property (assign, nonatomic)int zx_navFixHeight;

/**
 自定义导航栏固定frame
 */
@property (assign, nonatomic)CGRect zx_navFixFrame;

/**
 导航栏frame发生改变时的回调,可在这个block中return修改后的frame
 */
@property(copy, nonatomic)CGRect(^zx_navHandleFrameBlock)(CGRect oldFrame);


/**
 导航栏历史堆栈视图
 */
@property(weak, nonatomic)ZXNavHistoryStackContentView *zx_navHistoryStackContentView;

/**
 是否显示导航栏历史堆栈视图,默认为NO
 */
@property(assign, nonatomic)BOOL zx_showNavHistoryStackContentView;

/**
 导航栏历史堆栈视图偏离的x值,默认为0(导航栏历史堆栈视图与屏幕左侧距离默认等于leftBtn与屏幕左侧距离,此属性用于自定义在此基础上增加或减少的水平位移)
 */
@property(assign, nonatomic)CGFloat zx_navHistoryStackContentViewOffsetX;

/**
 导航栏历史堆栈视图Item展示最多的数量,默认为6个,超过6个显示由栈顶往下的6个
 */
@property(assign, nonatomic)long zx_navHistoryStackContentViewItemMaxLength;

/**
 导航栏历史堆栈视图显示样式
 */
@property (assign, nonatomic) ZXNavHistoryStackViewStyle zx_navHistoryStackViewStyle;

/**
 设置最左侧Button的图片和点击回调
 
 @param imgName 图片名字
 @param clickBlock 点击回调
 */
- (void)zx_setLeftBtnWithImgName:(NSString *)imgName clickedBlock:(nullable leftBtnClickedBlock)clickBlock;

/**
 设置左侧第二个Button的图片和点击回调
 
 @param imgName 图片名字
 @param clickBlock 点击回调
 */
- (void)zx_setSubLeftBtnWithImgName:(NSString *)imgName clickedBlock:(nullable subLeftBtnClickedBlock)clickBlock;

/**
 设置最右侧Button的图片和点击回调
 
 @param imgName 图片名字
 @param clickBlock 点击回调
 */
- (void)zx_setRightBtnWithImgName:(NSString *)imgName clickedBlock:(nullable rightBtnClickedBlock)clickBlock;

/**
 设置右侧第二个Button的图片和点击回调(此按钮您支持设置图片)
 
 @param imgName 图片名字
 @param clickBlock 点击回调
 */
- (void)zx_setSubRightBtnWithImgName:(NSString *)imgName clickedBlock:(nullable subRightBtnClickedBlock)clickBlock;


/**
 设置最左侧Button的文字和点击回调
 
 @param btnText 按钮文字
 @param clickBlock 点击回调
 */
- (void)zx_setLeftBtnWithText:(NSString *)btnText clickedBlock:(nullable leftBtnClickedBlock)clickBlock;

/**
 设置左侧第二个Button的文字和点击回调
 
 @param btnText 按钮文字
 @param clickBlock 点击回调
 */
- (void)zx_setSubLeftBtnWithText:(NSString *)btnText clickedBlock:(nullable subLeftBtnClickedBlock)clickBlock;

/**
 设置右侧第二个Button的文字和点击回调
 
 @param btnText 按钮文字
 @param clickBlock 点击回调
 */
- (void)zx_setSubRightBtnWithText:(NSString *)btnText clickedBlock:(nullable subRightBtnClickedBlock)clickBlock;

/**
 设置最右侧Button的文字和点击回调
 
 @param btnText 按钮文字
 @param clickBlock 点击回调
 */
- (void)zx_setRightBtnWithText:(NSString *)btnText clickedBlock:(nullable rightBtnClickedBlock)clickBlock;

/**
 设置最左侧Button的图片Url和点击回调
 
 @param imgUrlStr 图片Url
 @param placeholderImgName 占位图名称
 @param clickBlock 点击回调
 */
- (void)zx_setLeftBtnWithImgUrl:(NSString *)imgUrlStr placeholderImgName:(NSString *)placeholderImgName clickedBlock:(nullable leftBtnClickedBlock)clickBlock;

/**
 设置左侧第二个Button的图片Url和点击回调
 
 @param imgUrlStr 图片Url
 @param placeholderImgName 占位图名称
 @param clickBlock 点击回调
 */
- (void)zx_setSubLeftBtnWithImgUrl:(NSString *)imgUrlStr placeholderImgName:(NSString *)placeholderImgName clickedBlock:(nullable subLeftBtnClickedBlock)clickBlock;

/**
 设置最右侧Button的图片Url和点击回调
 
 @param imgUrlStr 图片Url
 @param placeholderImgName 占位图名称
 @param clickBlock 点击回调
 */
- (void)zx_setRightBtnWithImgUrl:(NSString *)imgUrlStr placeholderImgName:(NSString *)placeholderImgName clickedBlock:(nullable rightBtnClickedBlock)clickBlock;

/**
 设置右侧第二个Button的图片Url和点击回调
 
 @param imgUrlStr 图片Url
 @param placeholderImgName 占位图名称
 @param clickBlock 点击回调
 */
- (void)zx_setSubRightBtnWithImgUrl:(NSString *)imgUrlStr placeholderImgName:(NSString *)placeholderImgName clickedBlock:(nullable leftBtnClickedBlock)clickBlock;


/**
 设置最左侧按钮图片和点击回调
 
 @param img 图片
 @param clickBlock 点击回调
 */
- (void)zx_setLeftBtnWithImg:(UIImage *)img clickedBlock:(nullable leftBtnClickedBlock)clickBlock;

/**
 设置右侧按钮图片和点击回调
 
 @param img 图片
 @param clickBlock 点击回调
 */
- (void)zx_setRightBtnWithImg:(UIImage *)img clickedBlock:(nullable leftBtnClickedBlock)clickBlock;

/**
 设置右侧按钮图片和点击回调
 
 @param img 图片
 @param clickBlock 点击回调
 */
- (void)zx_setSubRightBtnWithImg:(UIImage *)img clickedBlock:(nullable leftBtnClickedBlock)clickBlock;

/**
 最左侧Button的点击回调
 
 @param clickBlock 点击回调
 */
- (void)zx_leftClickedBlock:(leftBtnClickedBlock)clickBlock;

/**
 左侧第二个Button的点击回调
 
 @param clickBlock 点击回调
 */
- (void)zx_subLeftClickedBlock:(subLeftBtnClickedBlock)clickBlock;

/**
 最右侧Button的点击回调
 
 @param clickBlock 点击回调
 */
- (void)zx_rightClickedBlock:(rightBtnClickedBlock)clickBlock;

/**
 右侧第二个Button的点击回调
 
 @param clickBlock 点击回调
 */
- (void)zx_subRightClickedBlock:(subRightBtnClickedBlock)clickBlock;

/**
 添加自定义导航栏
 
 @param navBar 自定义导航栏View
 */
- (void)zx_addCustomNavBar:(UIView *)navBar;

/**
 设置大小标题效果
 
 @param title 大标题
 @param subTitle 小标题
 */
- (void)zx_setMultiTitle:(NSString *)title subTitle:(NSString *)subTitle;

/**
 设置大小标题效果
 
 @param title 大标题
 @param subTitle 小标题
 @param subTitleFont 小标题字体
 @param subTitleColor 小标题颜色
 */
- (void)zx_setMultiTitle:(NSString *)title subTitle:(NSString *)subTitle subTitleFont:(UIFont *)subTitleFont subTitleTextColor:(UIColor *)subTitleColor;

/**
 设置导航栏背景渐变(颜色渐变从fromColor到toColor)
 
 @param fromColor 起止颜色
 @param toColor 终止颜色
 */
- (void)zx_setNavGradientBacFrom:(UIColor *)fromColor to:(UIColor *)toColor;

/**
 移除导航栏渐变背景
 */
- (void)zx_removeNavGradientBac;

/**
 添加自定义的TitleView
 
 @param customTitleView 自定义的TitleView
 */
- (void)zx_addCustomTitleView:(UIView *)customTitleView;


/**
 设置可伸缩折叠式导航栏
 
 @param folded 是否折叠,为否时即为展开
 @param speed 折叠效果动画速度,1-6,建议3
 @param offsetBlock 折叠动画导航栏位移回调,当控制器使用frame布局时,用于在导航栏高度更改时,同时设置导航栏下方视图的frame,此时获取到的offset就是导航栏实时相较自身位移距离
 @param completionBlock 折叠动画结束回调
 */
- (void)zx_setNavFolded:(BOOL)folded speed:(int)speed foldingOffsetBlock:(nullable foldingOffsetBlock)offsetBlock foldCompletionBlock:(nullable foldCompletionBlock)completionBlock;


/// 通过ScrollView滚动自动控制导航栏透明效果(类似微博热搜页面)
/// @param scrollView 滚动控制的scrollView,tableView或collectionView
/// @param fullChangeHeight scrollView.contentOffset.y达到fullChangeHeight时,导航栏变为完全不透明
/// @param changeLimitNavAlphe 当导航栏透明度达到changeLimitNavAlphe时,将触发opaqueBlock,通知控制器设置导航栏不透明时的效果
/// @param transparentBlock 导航栏切换到透明状态时的回调(默认透明度0.7为临界点)
/// @param opaqueBlock 导航栏切换到不透明状态时的回调(默认透明度0.7为临界点)
- (void)zx_setNavTransparentGradientsWithScrollView:(UIScrollView *)scrollView fullChangeHeight:(CGFloat)fullChangeHeight changeLimitNavAlphe:(CGFloat)changeLimitNavAlphe transparentGradientsTransparentBlock:(transparentGradientsTransparentBlock)transparentBlock transparentGradientsOpaqueBlock:(transparentGradientsOpaqueBlock)opaqueBlock;

/// 通过ScrollView滚动自动控制导航栏透明效果(类似微博热搜页面)
/// @param scrollView 滚动控制的scrollView,tableView或collectionView
/// @param fullChangeHeight scrollView.contentOffset.y达到fullChangeHeight时,导航栏变为完全不透明
/// @param changeLimitNavAlphe 当导航栏透明度达到changeLimitNavAlphe时,将触发opaqueBlock,通知控制器设置导航栏不透明时的效果
/// @param changeBlock 导航栏透明度正在改变回调
/// @param transparentBlock 导航栏切换到透明状态时的回调(默认透明度0.7为临界点)
/// @param opaqueBlock 导航栏切换到不透明状态时的回调(默认透明度0.7为临界点)
- (void)zx_setNavTransparentGradientsWithScrollView:(UIScrollView *)scrollView fullChangeHeight:(CGFloat)fullChangeHeight changeLimitNavAlphe:(CGFloat)changeLimitNavAlphe transparentGradientsChangingBlock:(transparentGradientsChangingBlock)changeBlock transparentGradientsTransparentBlock:(transparentGradientsTransparentBlock)transparentBlock transparentGradientsOpaqueBlock:(transparentGradientsOpaqueBlock)opaqueBlock;

/// 设置与pop手势冲突的scrollView数组以兼容pop手势与scrollView手势
/// @param scrollViewArr scrollView数组
/// 注意:因判断是否支持多层级的手势同时触发的block属于同一导航控制器,为避免block被子控制器覆盖后失效,以下代码建议写在子控制器的-viewWillAppear或-viewDidAppear中
- (void)zx_setPopGestureCompatibleScrollViews:(NSArray <UIScrollView *>*)scrollViewArr;

/// 设置与pop手势冲突的scrollView以兼容pop手势与scrollView手势
/// @param scrollView scrollView
/// 注意:因判断是否支持多层级的手势同时触发的block属于同一导航控制器,为避免block被子控制器覆盖后失效,以下代码建议写在子控制器的-viewWillAppear或-viewDidAppear中
- (void)zx_setPopGestureCompatibleScrollView:(UIScrollView *)scrollView;

/// 手动显示导航栏历史堆栈view
- (void)zx_showNavHistoryStackView;

///scrollView滚动,如需使用scrollViewDidScroll请重写此方法
- (void)zx_scrollViewDidScroll:(UIScrollView *)scrollView;
@end

NS_ASSUME_NONNULL_END