#import "ZXNavigationBarController.h"
自定义titleView |
切换系统导航栏 |
可伸缩式导航栏 |
![](https://camo.githubusercontent.com/f36a58ace257d157a32392d17f02689768b12e7e92069a46f2f089aa0e3aee7d/687474703a2f2f7777772e7a786c65652e636e2f6769746875622f5a584e617669676174696f6e4261722f5a584e617669676174696f6e42617244656d6f342e676966) |
![](https://camo.githubusercontent.com/bc53250250251837270bab78d94d2053d7cde5d5159f03692d98b8e8f2c39740/687474703a2f2f7777772e7a786c65652e636e2f6769746875622f5a584e617669676174696f6e4261722f5a584e617669676174696f6e42617244656d6f352e676966) |
![](https://camo.githubusercontent.com/d543bed5964e47b8751946bfab87cabf6cfc084b4aebf59318e9f2d488894fd8/687474703a2f2f7777772e7a786c65652e636e2f6769746875622f5a584e617669676174696f6e4261722f5a584e617669676174696f6e42617244656d6f362e676966) |
将控制器继承于ZXNavigationBarController
,建议将Base控制器继承于ZXNavigationBarController
@interface DemoBaseViewController : ZXNavigationBarController
@end
ZXNavigationBar
会自动显示返回按钮,且实现点击pop功能,您无需设置,若需要自定义返回按钮,直接覆盖self.zx_navLeftBtn
的图片和点击回调即可
- 如果项目中存在黑白状态栏交替的需求,建议先在base控制器的
viewDidLoad
方法中统一设置状态栏颜色,以避免设置成白色状态栏后返回上一个页面无法自动恢复为黑色状态栏
@interface DemoBaseViewController : ZXNavigationBarController
- (void)viewDidLoad{
[super viewDidLoad];
self.zx_navStatusBarStyle = ZXNavStatusBarStyleDefault;
}
@end
ZXNavigationBarController
作了自动隐藏导航栏的处理,但由于导航栏早于内部子控制器加载,因此有可能造成自定义导航栏抖动或状态栏颜色黑白相嵌的问题,
若您遇到此问题,请在base导航控制器的pushViewController:animated:
中设置self.navigationBarHidden = YES;
或在Appdelegate的application:didFinishLaunchingWithOptions:
中调用方法[UINavigationController zx_hideAllNavBar]
【需要先#import "ZXNavigationBarController.h"
】
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//这个方法需要在导航控制器加载前调用
[UINavigationController zx_hideAllNavBar];
UIWindow *window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
DemoListViewController *vc = [[DemoListViewController alloc]init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
window.rootViewController = nav;
[window makeKeyAndVisible];
self.window = window;
return YES;
}
@end
【重要】关于自定义导航栏view内容无法自动下移的处理方式
- 如果是系统的导航栏,view的内容会自动下移,如64像素
- 设置了自定义的导航栏,它实际上就是普通的View,则view中的内容不会自动下移以避免挡住导航栏
ZXNavigationBar
的处理方法是:
- 如果您是通过frame或者Masonry设置控件布局,请设置y距离顶部高度为导航栏高度,可直接使用
ZXNavBarHeight
这个宏
- 如果您是通过Xib加载控制器View,则
ZXNavigationBar
会自动将内部约束设置为距离顶部为导航栏高度+原始高度,您无需作任何处理
- 若您是通过Xib加载控制器View,且禁用了SafeArea,请设置:
//若大多数控制器都从Xib加载并禁用了SafeArea,可以直接在Base控制器中设置
self.zx_isEnableSafeArea = NO;
self.title = @"ZXNavigationBar";
或
self.zx_navTitle = @"ZXNavigationBar";
self.zx_navTitleLabel.textColor = @"ZXNavigationBar";
self.zx_navTitleLabel.fontSize = [UIFont systemFontOfSize:20];
- 设置导航栏标题其他属性,通过控制
self.zx_navTitleLabel
即可
[self zx_setRightBtnWithImgName:@"set_icon" clickedBlock:^(UIButton * _Nonnull btn) {
NSLog(@"点击了最右侧的Button");
}];
[self zx_setRightBtnWithText:@"右侧按钮" clickedBlock:^(UIButton * _Nonnull btn) {
NSLog(@"点击了最右侧的Button");
}];
根据左侧/右侧的按钮对象进行具体设置(以左侧按钮为例)
//由于ZXNavigationBar会自动在左侧添加返回图片和点击返回事件,因此只需要设置返回的文字即可
[self.zx_navLeftBtn setTitle:@"返回" forState:UIControlStateNormal];
- 设置导航栏左侧/右侧的按钮的其他非frame相关属性,通过控制
self.zx_navLeftBtn/zx_navRightBtn
即可
//将oldImage渲染为红色
UIImage *resultImage = [oldImage zx_renderingColor:[UIColor redColor]];
//将按钮宽高设置为30
self.zx_navItemSize = 30;
//将按钮边距设置为0
self.zx_navItemMargin = 0;
- 将上诉例子中
zx_navLeftBtn
/zx_navRightBtn
修改为zx_navSubRightBtn
即可
self.zx_navBar.backgroundColor = [UIColor orangeColor];
self.zx_navBar.zx_bacImage = [UIImage imageNamed:@"nav_bac"];
//从magentaColor到cyanColor渐变
[self zx_setNavGradientBacFrom:[UIColor magentaColor] to:[UIColor cyanColor]];
[self zx_removeNavGradientBac];
设置导航栏TintColor(此属性可以将导航栏的title颜色、左右Button的文字和图片颜色修改为TintColor)
self.zx_navTintColor = [UIColor yellowColor];
自定义导航栏高度(若设置此属性,则ZXNavigationBar不会再使用默认的导航栏高度)
self.zx_navFixHeight = 30;
[self zx_setMultiTitle:@"ZXNavigationBar" subTitle:@"subTitle"];
self.zx_navLineView.backgroundColor = [UIColor blueColor];
- 分割线其他其他非frame相关属性通过
self.zx_navLineView
设置即可
- 如果设置了控制器的Xib且在Xib中设置了子视图的约束(仅需设置展开或者折叠导航栏与动画效果速度,无需手动调整控制器View子视图的frame)
//第一个参数folded:控制是展开还是折叠导航栏;第二个参数speed:控制展开或收缩导航栏的速度,0-6,建议值为3;第三个参数offsetBlock:折叠动画导航栏位移回调;第四个参数completionBlock:折叠动画结束回调
[self zx_setNavFolded:YES speed:3 foldingOffsetBlock:nil foldCompletionBlock:nil];
- 如果是通过Frame设置控制器View的子视图(如TableView),需要在
foldingOffsetBlock
回调中控制导航栏下方View的frame,使其始终紧贴导航栏底部
__weak typeof(self) weakSelf = self;
[self zx_setNavFolded:shouldFold speed:3 foldingOffsetBlock:^(CGFloat offset) {
//tableView的y值跟随这导航栏变化(导航栏高度减小,tableView的y值减小)
weakSelf.tableView.y += offset;
//tableView的高度值跟随这导航栏变化(导航栏高度减小,tableView高度增加)
weakSelf.tableView.height -= offset;
}
self.zx_navStatusBarStyle = ZXNavStatusBarStyleLight;
self.zx_navStatusBarStyle = ZXNavStatusBarStyleDefault;
//显示系统导航栏将会自动隐藏ZXNavigationBar
self.zx_showSystemNavBar = YES;
//显示系统导航栏将会自动隐藏ZXNavigationBar
self.zx_hideBaseNavBar = YES;
//务必仅当存在系统导航栏与自定义导航栏过渡时启用,非必要请勿启用,否则可能造成自定义导航栏跳动,若当前控制器显示了系统导航栏,请于当前控制器pop的上一个控制器中使用self.zx_navEnableSmoothFromSystemNavBar = YES)
self.zx_navEnableSmoothFromSystemNavBar = YES;
禁止Xib加载控制器情况下自动将顶部View约束下移导航栏高度(默认为否)
self.zx_disableNavAutoSafeLayout = YES;
//创建自定义View
UIView *customTitleView = [[UIView alloc]init];
[self zx_addCustomTitleView:customTitleView];
//创建自定义View
UIView *customNav = [[UIView alloc]init];
[self zx_addCustomNavBar:customNav];
更多示例,可下载Demo查阅,若有任何问题,可随时在issue中提出