学习笔记 ---UITabBarController

UITabBarController是开发中非常常见的一种控制器,使用频率也很高,可以使用系统自带的,也可以通过修改tabbar来自定义。

此处记录一下系统的UITabBarController的使用以及注意点,这只是我个人使用时的记录,仅供参考。

层级关系

UITabBarController底部是系统的tabBar,tabBar包含了和子控制器个数相同的UITabBarItem,UITabBarItem的属性可以通过子控制器本身来设置,下面会详细介绍这些属性。

首先添加自控制器,并且设置初始化tabBarItem基本属性

-(void)addChildControllers{
    HomeViewcontroller *home = [[HomeViewcontroller alloc] init];
    MessageViewController *message = [[MessageViewController alloc] init];
    MineViewcontroller *mine = [[MineViewcontroller alloc] init];
    APPlicationController *applection = [[APPlicationController alloc] init];
    MindleController *mindle = [[MindleController alloc] init];
    [self setChildController:home image:[self setOriginImage:[UIImage imageNamed:@"homepage"]] selectImage:[self setOriginImage:[UIImage imageNamed:@"homepageSelected"]] title:@"首页"];
    [self setChildController:message image:[self setOriginImage:[UIImage imageNamed:@"message"]] selectImage:[self setOriginImage:[UIImage imageNamed:@"messageSelected"]] title:@"消息"];
    [self setChildController:mindle image:[self setOriginImage:[UIImage imageNamed:@"setQuestion"]] selectImage:[self setOriginImage:[UIImage imageNamed:@"setQuestion"]] title:nil];
    [self setChildController:mine image:[self setOriginImage:[UIImage imageNamed:@"mall"]] selectImage:[self setOriginImage:[UIImage imageNamed:@"mallSelected"]] title:@"我的"];
    [self setChildController:applection image:[self setOriginImage:[UIImage imageNamed:@"statistics"]] selectImage:[self setOriginImage:[UIImage imageNamed:@"statisticsSelected"]] title:@"统计"];
}
-(void)setChildController:(UIViewController*)vc image:(UIImage*)image selectImage:(UIImage*)selectImage title:(NSString*)title{
    //item未选中时的Image
    vc.tabBarItem.image = image;
    //item 选中时的image
    vc.tabBarItem.selectedImage = selectImage;
    //item的标题
    vc.tabBarItem.title = title;
    //控制器的标题,如果没有设置 vc.tabBarItem.title ,item的标题也是这个title
    vc.title = title;
    if ([vc isMemberOfClass:[MindleController class]]) {
        //修改图片的位置属性时,不要通过下面注释的方法,用这方法拿到的item设置image位置属性时无效
//        UITabBarItem *mindleItem = self.tabBar.items [2];
//        mindleItem.imageInsets = UIEdgeInsetsMake(0, -10, -6, -10);
        vc.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);
    }
    [self addChildViewController:[[MineNavigationController alloc] initWithRootViewController:vc]];
}
//保持图片原样
-(UIImage*)setOriginImage:(UIImage*)image{
    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    return image;
}

tabBarItem常用基础属性

   //item未选中时的Image
    vc.tabBarItem.image = image;

    //item 选中时的image
    vc.tabBarItem.selectedImage = selectImage;

    //item的标题
    vc.tabBarItem.title = title;

    //控制器的标题,如果没有设置 vc.tabBarItem.title ,item的标题也是这个title
    vc.title = title;

   //修改图片的位置属性时,不要通过下面注释的方法,用这方法拿到的item设置image位置属性时无效
   // UITabBarItem *mindleItem = self.tabBar.items [2];
   // mindleItem.imageInsets = UIEdgeInsetsMake(0, -10, -6, -10);

   //可以通过调整imageInsets的值来设置类似新浪微博中间加号的效果
    vc.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);

  //设置指定itme的tittle的横竖的偏移量(水平的我试了一下好像没有效果)正数是向下偏移
  [mindleItem setTitlePositionAdjustment:UIOffsetMake(0, 20)];

  //可以通过此方法来设置item的字体,颜色,大小等。颜色也可以通过tabBar的属性来设置。
  - (void)setTitleTextAttributes:(nullable NSDictionary   *)attributes forState:(UIControlState)state

tabBar的基础属性

   //设置item的title的选中颜色(直接设置会使得图片也会被渲染成指定的颜色)
    self.tabBar.tintColor = [UIColor redColor];
    
    //设置tabBar的背景色
    self.tabBar.barTintColor = [UIColor yellowColor];
    
    //设置item的title的未选中状态颜色(直接设置会使得图片也会被渲染成指定的颜色)
    self.tabBar.unselectedItemTintColor = [UIColor lightGrayColor];
    
    //设置item选中时的背景图片
    self.tabBar.selectionIndicatorImage = [UIImage imageNamed:@"c8b5d3679cedc1df9933df4720b71c76"];
    
    //设置tabBar的背景图片(最好将图片高度设置为49)
    self.tabBar.backgroundImage = [UIImage imageNamed:@"16ef45ad5993444ee1c9b0523b882040"];
    
    //设置tabBar最上面的那个像素的图片(此属性必须和backgroundImage属性一起使用,否则无效)
    self.tabBar.shadowImage = [UIImage imageNamed:@"c03314d5eed9281b96accc5a9e226227"];

self.tabBar.shadowImage图片的效果图,粉色部分就是,如果不设置backgroundImage则没有效果。

屏幕快照 2017-05-31 下午2.05.44.png

直接使用self.tabBar.tintColor或者self.tabBar.unselectedItemTintColor会将图片也渲染,设置self.tabBar.tintColor为红色时,图片也被渲染成红色。

屏幕快照 2017-05-31 下午1.50.54.png

使用下面方法可以恢复图片原来的颜色

-(UIImage*)setOriginImage:(UIImage*)image{
    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    return image;
}

最后说一下在导航栏中跳转界面时如何隐藏tabBar

也没什么好说的就是调用控制器的hidesBottomBarWhenPushed 属性
在自定义的导航控制器中重写下面方法即可。

  override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        print(self.viewControllers.count)
        if self.viewControllers.count==1 {
           viewController.hidesBottomBarWhenPushed  = true
        }
        super.pushViewController(viewController, animated: animated)
    }

有什么不对的地方,请大家指导。

你可能感兴趣的:(学习笔记 ---UITabBarController)