UINavigationController(导航栏、状态栏、i
框架定义了UINavigationController的子类JMNavigationController
,在该文件里将系统的navigationBar隐藏起来,然后使用自定义的navigationBar。所以框架中使用JMNavigationController
去实例化导航栏。
HomeViewController *vc1 = [[HomeViewController alloc] initWithStoryboardName:@"Home"];
JMNavigationController *nav1 = [[JMNavigationController alloc] initWithRootViewController:vc1];
使用方法跟UINavigationController没区别。
目录
1、设置全局导航栏样式
2、设置个别导航栏样式
3、iPhone X的适配
4、全局状态栏(电池栏)
5、个别界面状态栏
设置全局导航栏样式
一个项目里,导航栏会有一个主样式,这时候我们在JMNavUIBaseViewController
去设置
- 是否需要导航栏
- (BOOL)navUIBaseViewControllerIsNeedNavBar:(JMNavUIBaseViewController *)navUIBaseViewController {
return YES;
}
- 设置背景颜色
/** 背景色 */
- (UIColor *)jmNavigationBackgroundColor:(JMNavigationBar *)navigationBar {
return kColorMain;
}
- 设置背景图片
/** 背景图片 */
- (UIImage *)jmNavigationBarBackgroundImage:(JMNavigationBar *)navigationBar
{
}
- 设置标题
/**头部标题*/
- (NSMutableAttributedString*)jmNavigationBarTitle:(JMNavigationBar *)navigationBar {
return [self changeTitle:self.title ?: self.navigationItem.title];
}
这里返回的是富文本,可以在changeTitle
方法中设置字体大小和颜色
- 导航栏的返回按钮图标
/** 导航条左边的按钮 */
- (UIImage *)jmNavigationBarLeftButtonImage:(UIButton *)leftButton navigationBar:(JMNavigationBar *)navigationBar
{
return [UIImage imageNamed:@"NavigationBack"];
}
- 是否显示底部的黑线
/** 是否显示底部黑线 */
- (BOOL)jmNavigationIsHideBottomLine:(JMNavigationBar *)navigationBar
{
return NO;
}
一个全局导航栏样式基本就是涉及这几个DataSource方法,注意设置背景色跟背景图片两个只能存在一个。
设置个别导航栏样式
一个项目中肯定会有个别不同的导航栏,此时如何设置呢?
那就是在那个VC中实现不同的DataSource方法去更改样式。
@protocol JMNavigationBarDataSource<NSObject>
@optional
/**头部标题*/
- (NSMutableAttributedString*)jmNavigationBarTitle:(JMNavigationBar *)navigationBar;
/** 背景图片 */
- (UIImage *)jmNavigationBarBackgroundImage:(JMNavigationBar *)navigationBar;
/** 背景色 */
- (UIColor *)jmNavigationBackgroundColor:(JMNavigationBar *)navigationBar;
/** 是否显示底部黑线 */
- (BOOL)jmNavigationIsHideBottomLine:(JMNavigationBar *)navigationBar;
/** 导航条的高度 */
- (CGFloat)jmNavigationHeight:(JMNavigationBar *)navigationBar;
/** 导航条的左边的 view */
- (UIView *)jmNavigationBarLeftView:(JMNavigationBar *)navigationBar;
/** 导航条右边的 view */
- (UIView *)jmNavigationBarRightView:(JMNavigationBar *)navigationBar;
/** 导航条中间的 View */
- (UIView *)jmNavigationBarTitleView:(JMNavigationBar *)navigationBar;
/** 导航条左边的按钮 */
- (UIImage *)jmNavigationBarLeftButtonImage:(UIButton *)leftButton navigationBar:(JMNavigationBar *)navigationBar;
/** 导航条右边的按钮 */
- (UIImage *)jmNavigationBarRightButtonImage:(UIButton *)rightButton navigationBar:(JMNavigationBar *)navigationBar;
@end
@protocol JMNavigationBarDelegate <NSObject>
@optional
/** 左边的按钮的点击 */
-(void)leftButtonEvent:(UIButton *)sender navigationBar:(JMNavigationBar *)navigationBar;
/** 右边的按钮的点击 */
-(void)rightButtonEvent:(UIButton *)sender navigationBar:(JMNavigationBar *)navigationBar;
/** 中间如果是 label 就会有点击 */
-(void)titleClickEvent:(UILabel *)sender navigationBar:(JMNavigationBar *)navigationBar;
@end
加上
- (BOOL)navUIBaseViewControllerIsNeedNavBar:(JMNavUIBaseViewController *)navUIBaseViewController
导航栏相关的方法都在这了。
举个例子,现在要修改右边的按钮显示文字“提现记录”
-(UIImage *)jmNavigationBarRightButtonImage:(UIButton *)rightButton navigationBar:(JMNavigationBar *)navigationBar{
[JMCommonMethod navigationItemSet:rightButton fontColor:[UIColor whiteColor]];
[rightButton setFrame:CGRectMake(0, 0, 100, 44)];
[rightButton setTitle:@"提现记录" forState:UIControlStateNormal];
return nil;
}
-(void)rightButtonEvent:(UIButton *)sender navigationBar:(JMNavigationBar *)navigationBar{
UCWithdrawalRecordViewController *recordVC = [[UCWithdrawalRecordViewController alloc] initWithStoryboardName:@"UserCenterTwo"];
[self.navigationController pushViewController:recordVC animated:YES];
}
告诉你个小技巧,如果导航栏很复杂,如搜索栏(如果觉得这个简单,那就想想更复杂的)。你可以在VC中设置不显示导航栏,然后在storyboard中布局好导航栏,VC中就可以直接用了。
iPhone X的适配
结合storyboard使用时注意,上边距是针对于Safe Area距离44(如果你的导航栏高度不是44,那是多少就设置多少吧)
搞清楚Safe Area跟Superview的区别,原谅我写不清楚。搞不清楚的来找我,当面教。
全局状态栏(电池栏)
也是在JMNavUIBaseViewController
中设置
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
- (BOOL)prefersStatusBarHidden {
return NO;
}
注意:info.plist文件中一定不能添加View controller-based status bar appearance,添加了设置为NO也不行,就是不要让这个存在。当然了,如果想更改启动页的电池栏,参考下图
个别界面状态栏
这个就是在VC中更改那两个代理了,这个是系统VC的代理。
结语:讲解的比较佛系,大家不懂的地方直接问我。文章上可以优化的地方,大家也多提建议。