美文网首页
UINavigationController(导航栏、状态栏、i

UINavigationController(导航栏、状态栏、i

作者: Liuny | 来源:发表于2018-12-17 23:03 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:UINavigationController(导航栏、状态栏、i

          本文链接:https://www.haomeiwen.com/subject/ftvhkqtx.html