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<NSString *,id> *)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则没有效果。
直接使用self.tabBar.tintColor或者self.tabBar.unselectedItemTintColor会将图片也渲染,设置self.tabBar.tintColor为红色时,图片也被渲染成红色。
使用下面方法可以恢复图片原来的颜色
-(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)
}