UINavigationController(导航栏、状态栏、i

2018-12-17  本文已影响0人  Liuny

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

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

上一篇下一篇

猜你喜欢

热点阅读