美文网首页code我的iOS开发小屋常用的第三方
UINavigationbar和UITabbar 的那些事

UINavigationbar和UITabbar 的那些事

作者: icoder | 来源:发表于2015-07-22 23:09 被阅读5794次

    工作很长一段时间了,搭建框架的时候没有搭好,然后,需求又一直改变,其中导航条和标签栏的修改是比较难受的,特别是完全使用系统的导航条和标签栏。
    比如:
    1.修改导航条的返回按钮的的图片
    2.修改导航返回按钮的文字颜色和大小
    3.去掉导航条的返回文字
    4.统一修改导航标题的字体样式和大小
    5.修改标签栏的字体样式和颜色
    6.把标签栏的文字去掉只留下图片
    7.把导航条和标签栏的黑线去掉
    8 在跳转到下一个页面的时候隐藏标签栏
    这些东西不难,但是要是不熟悉,产品经理要你改的时候,觉得很恶心,下面我就一一来说说这个怎么弄,然后我写一个demo放在github 上提供大家参考,也可以直接使用我写好的TabbarController框架。
    先看一下效果吧(顺便加了大神写的一个全屏侧滑返回的方法)

    tabbar.gif

    先说一下导航条:

    新建一个继承字UINavigationController 的类,在类的.m 文件中
    <pre><code> 先设置导航条不透明
    self.navigationBar.translucent = NO;
    //设置导航条的背景颜色
    self.navigationBar.barTintColor = Nav_background_Color;
    //设置导航条的主色调颜色
    self.navigationBar.tintColor = Nav_tintColor;</code></pre>

    //设置返回按钮为自定义图片
    <pre><code>
    //设置返回的箭头自定义图片
    //imageWithRenderingMode 这个是图片的显示模式,设置成其他的选项,你的返回按钮的颜色不是自己图片颜色
    UIImage *backimage =[Nav_back_icon imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    //注意:下面两个属性都得设置,只设置一个是无效的
    [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backimage];
    [[UINavigationBar appearance]setBackIndicatorImage:backimage];
    </code></pre>

    //去掉导航条的返回文字,去掉这个还真的不好去掉,钻了空子,设置了文字的PositionAdjustmen就可以了
    <pre><code>
    // 去掉返回按钮文字
    UIBarButtonItem *baritem =[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
    UIOffset offset;
    offset.horizontal = -500;
    [baritem setBackButtonTitlePositionAdjustment:offset forBarMetrics:UIBarMetricsDefault];
    </code></pre>
    //导航条上文字设置
    <pre><code>
    //设置返回按钮
    [baritem setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} forState:UIControlStateNormal];<code></code>
    //改变导航的title 字体的样式
    <code>NSDictionary *titleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:Nav_Title_Color,NSForegroundColorAttributeName,Nav_Title_Font,NSFontAttributeName, nil]; [[UINavigationBar appearance] setTitleTextAttributes:titleAttributes];
    </code></pre>
    // 这里重写了系统的push到下一个页面的方法,使用viewController.hidesBottomBarWhenPushed跳转到下一个页面的导航条
    <pre><code>
    -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
    if (self.viewControllers.count>0) {
    ///第二层viewcontroller 隐藏tabbar
    viewController.hidesBottomBarWhenPushed=YES;
    }
    [super pushViewController:viewController animated:YES];
    }</code></pre>

    导航栏说完了,下面说下标签栏了。

    新建一个继承自UITabBarController的类
    <pre><code>
    //设置背景颜色
    self.tabBar.barTintColor = Tab_BAR__BACK_CLOLOR;
    //设置标签不透明
    self.tabBar.translucent= NO;
    //常规设置
    NSArray *classNameArray =[NSArray arrayWithObjects:@"FirstViewController",@"SecondViewController",@"ThirdViewController", nil];
    NSArray *titleArray =[NSArray arrayWithObjects:@"first",@"second",@"third", nil];
    NSArray *normalImageArray =[NSArray arrayWithObjects:@"feed_tab_butten_normal.png",@"movie_tab_butten_normal.png",@"me_tab_butten_normal.png",nil];
    NSArray *selectImageArray =[NSArray arrayWithObjects:@"feed_tab_butten_press.png",@"movie_tab_butten_press.png",@"me_tab_butten_press.png", nil];

    NSMutableArray  *navigationArray =[[NSMutableArray alloc]init];
    for (int i=0; i<classNameArray.count; i++) {
        UIViewController  *vc =(UIViewController *)[[NSClassFromString(classNameArray[i]) alloc] init];
        vc.title=titleArray[i];
        UIImage  *normalImage =[UIImage imageNamed:normalImageArray[i]];
        UIImage  *selectImage =[UIImage imageNamed:selectImageArray[i]];
        vc.tabBarItem.image =[normalImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        vc.tabBarItem.selectedImage=[selectImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    

    去掉标签栏的文字,也是跟导航栏的文字一样的道理,设置便宜,巧妙的去掉了标签栏文字,这里设置后,下面设置字体样式就没有意义了。
    UIOffset offoset = UIOffsetMake(0, 300);
    [vc.tabBarItem setTitlePositionAdjustment:offoset];
    BaseNavigationViewController *na =[[BaseNavigationViewController alloc]initWithRootViewController:vc];
    [navigationArray addObject:na];
    }
    self.viewControllers=navigationArray;
    //标签栏的文字设置
    UITabBarItem *item = [UITabBarItem appearance];
    //正常状态的文字
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:Tab_TITLE_NORMAL_COLOR, NSFontAttributeName:Tab_TITLE_FONT} forState:UIControlStateNormal];
    //选择的文字
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:Tab_TITLE_SELECTED_COLOR, NSFontAttributeName:Tab_TITLE_FONT} forState:UIControlStateSelected];</code></pre>
    //差点忘了说怎么修改导航条和标签栏下面黑线的颜色了,这个imageWithColor:是我写的把颜色转化成图片的类。
    <pre>[self.navigationController.navigationBar setShadowImage:[UIImage imageWithColor:VLight_GrayColor_apla]];
    [self.tabBarController.tabBar setShadowImage:[UIImage imageWithColor:VLight_GrayColor_apla]];
    </pre>
    好了,到这里,高度自定义的导航条和标签栏就完成了,而且我们完全使用系统的,由于本人技术有限,所有希望大家有什么问题斧正啊。
    代码我放在了github上 地址是
    ZFYTabbarController

    相关文章

      网友评论

      • feng_dev:设置返回按钮为自定义图片 和 去掉返回按钮的文字 这俩,
        是不是在 nav 的 子类 里面 的 push 方法 里面 自定义 也行呢
      • 巴图鲁:膜拜
      • 上发条的树:代码排下版吧大哥
      • 光明程辉:要是页面排版好一点就很nice了,要想看完博主的代码,要用鼠标往右移动很长!
      • 羽纱:弱弱的问下楼主。。
        直接用aspects注入,不久可以全局修改,不用写基类了吗
      • quakex:Thank you
      • 风了个1:太好了,希望作者能继续发表更好的文章

      本文标题:UINavigationbar和UITabbar 的那些事

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