1、TabBarItem设置:
TabBarItem上的图片默认选中会被渲染成蓝色,如果想去除掉,有两种方法:
1)、更改图片渲染设置,将default改成original(此操作可批量设置)
2)、代码设置
UIImage *image=[UIImage imageNamed:@"name"];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
tabBarItem.selectedImage = image;
同上,TabBarItem上的按钮文字默认选中也会被渲染成蓝色,如果想去除掉:
[tabBarItem setTitleTextAttributes:nil forState:nil];
2、appearance的使用
Warning:appearance会获取整个应用程序下的控件并进行统一设置,如果有其他地方也有该控件,同样会对齐进行设置,所以请谨慎使用,为解决这个问题,可以换一个方法进行设置:
UITabBarItem *item = [UITabBarItem appearanceWhenContainedIn:@"当前需要设置的类",nil];
//表示该设置仅影响当前类,不再会全局更改
在初始化UITabBarController的时候,可以对其外观进行一次统一设置
UITabBarItem *item = [UITabBarItem appearance];
[tabBarItem setTitleTextAttributes:nil forState:nil];
这样对于上面那个文字选中被渲染成蓝色的问题就可以不用一个标题一个标题的进行设置
3、自定义TabBarItem的图片位置:
对于有些APP的tabBar中间那个TabBarItem不需要标题,直接是一个大图,需要调整这个图的位置,我们可以使
//当图片太大的时候,直接使用imageWithName图片可能会显示不出来,所以需要让系统不对大图进行渲染
vc.tabBarItem.image = [UIImage imageOriginalWithName:@"image"];
//进行位置调整
vc.tabBarItem.imageInsets = UIEdgeInsetsMake(10,10,10,10);
4、自定义TabBar实现中间一个大按钮的效果
#import "XBYTabBar.h"
@interface XBYTabBar()
@property(nonatomic,strong) UIButton *addButton;
@end
@implementation XBYTabBar
-(UIButton *)addButton {
if (!_addButton) {
_addButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self addSubview:_addButton];
[_addButton setImage:[UIImage imageNamed:@"image"] forState:UIControlStateNormal];
[_addButton sizeToFit]; //自适应图片的大小
}
return _addButton;
}
-(void)layoutSubviews {
[super layoutSubviews];
NSInteger itemCount = self.items.count + 1; //最中间添加一个按钮
CGFloat width = self.bounds.size.width / itemCount;
CGFloat height = self.bounds.size.height;
CGFloat x=0;
int i=0;
//遍历子控件,进行布局调整
for (UIView *tabBarButton in self.subviews) {
//这里UITabBarButton是系统私有类,不能直接使用
if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
NSLog(@"tabBarButton");
if (i==2) {
i+=1;
}
x=i*width;
tabBarButton.frame = CGRectMake(x, 0, width, height);
i++;
}
}
self.addButton.center = CGPointMake(self.bounds.size.width*0.5, self.bounds.size.height*0.5);
// self.addButton.center = self.center;不能这么写,center是相当于父布局的,self.center,高度h基本趋于屏幕高度,此时self.addButton.center = self.center的话,addButton会在此基础上,向下一个h的高度
// frame和center都是相对于父控件,bounds相对于自己
}
在UITabBarController添加完子控制器之后,使用KVC替换系统tabBar
[tabBarC setValue:[[XBYTabBar alloc] init] forKey:@"tabBar"];//需要在系统将UITabBarButton添加到UITabBar上之前替换
因为tabBarC.tabbar = [[XBYTabBar alloc] init];不让访问
PS:KVC的底层实现原理:1、先去底层找是否有对应属性的set方法(没有);2、找是否有tabBar这个属性(没有);3、找是否有_tabBar(有,进行设置)。(对属性进行设置,而不是通过set方法)