UINavigationController(导航栏、状态栏、iPhone X适配)

框架定义了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的代理。

结语:讲解的比较佛系,大家不懂的地方直接问我。文章上可以优化的地方,大家也多提建议。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 帘外雪纷纷 阶前雨淋淋 枯坐谓所意 无物可托心
    墨初__庸人安好阅读 234评论 0 0
  • 今天发小打电话来,闲聊家常,她说大年初三和婆婆吵了一架,以后再也不想回去了。吵架的原因是,发小~~媛,结婚八年,没...
    笑着就忘了阅读 433评论 0 0
  • 车窗外黄土地换了荒凉山浑浊的水淌过白丝带住进枯木隧道是天空大地在告别夜晚只负责沉默 沉默时落笔的文字是红色红色的漂...
    且安君阅读 233评论 2 4
  • 手机,如今已经贯穿了人类生活的方方面面,人们的吃穿住行都能和手机扯上关联。的确,手机的存在使得这些活动变得简单...
    宇过明晴阅读 626评论 1 1
  • 霜天晓角 中秋明月,高挂八方烨。休说肃霜铺地,更似那、金银屑。 闲吟秋景末,应怜...
    陈庆利阅读 209评论 0 0

友情链接更多精彩内容