國內(nèi)應(yīng)用的比較流行風(fēng)格是由一個UITabBarController來控制不同的板塊。很多應(yīng)用因為營銷的關(guān)系需要隨著各個時間段的不同而調(diào)整UITabBarController里面的各個Controller對應(yīng)的tabBarItem的image/selectedImage/title。例如:餓了么,淘寶,優(yōu)酷....
實現(xiàn)如下:
1.創(chuàng)建一個繼承UITabBarController的子類->>RFTabBarController;
2.在RFTabBarController的.m文件中重寫方法- (void)viewDidLoad;
在- (void)viewDidLoad;中初始化它管理的各個控制器對應(yīng)的tabBarItem。
3.初始化要用下面這個方法:
UITabBarItem *item1 = [[UITabBarItem alloc]
initWithTitle:@"VC1" image:[[UIImage imageNamed:@"VC1_icon"]
imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
selectedImage:[[UIImage imageNamed:@"VC1_seleted_icon"]
imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
然后用同樣的方法初始化其他幾個控制器的tabBarItem;
- 當(dāng)需要修改tabBarItem的image/selectedImage/title時,這些材料從哪里來?
有些應(yīng)用在發(fā)布之前已經(jīng)計劃好未來會使用到什么樣的圖片,他們會直接把文件放到項目的圖片文件夾中,但是更多的情況是,應(yīng)用的運營者并不知道未來會使用到什么圖片和標題。
這個時候就需要結(jié)合服務(wù)器,當(dāng)應(yīng)用需要更改tabBarItem的image/selectedImage/title時,服務(wù)器就發(fā)一個包給客戶端,客戶端收到包后,讀取其中配置文件的數(shù)據(jù)set到一個自定義的專門用于配置UITabBarController的各個控制器對應(yīng)的tabBarItem的image/selectedImage/title屬性的類中。
例如可以封裝一個模型類:RFTabbarItemsModel
/**標簽欄背景圖片寬度:320*/
@property (nonatomic,strong) NSString *tabbarBgImage320Path;
/**標簽欄背景圖片寬度:375*/
@property (nonatomic,strong) NSString *tabbarBgImage375Path;
/**標簽欄背景圖片寬度:540*/
@property (nonatomic,strong) NSString *tabbarBgImage540Path;
@property (nonatomic,strong) NSString *kuControlImagePath;
@property (nonatomic,strong) NSString *kuControlUnselectImagePath;
@property (nonatomic,strong) NSString *serviceImagePath;
@property (nonatomic,strong) NSString *serviceUnselectImagePath;
@property (nonatomic,strong) NSString *findImagePath;
@property (nonatomic,strong) NSString *findUnselectImagePath;
@property (nonatomic,strong) NSString *mineImagePath;
@property (nonatomic,strong) NSString *mineUnselectImagePath;
/**四個標簽的標題*/
@property (nonatomic,strong) NSString *title1;
@property (nonatomic,strong) NSString *title2;
@property (nonatomic,strong) NSString *title3;
@property (nonatomic,strong) NSString *title4;
5.在RFTabBarController的.m文件中聲明一個用戶修改tabBarItem的image/selectedImage/title的方法
#pragma mark 監(jiān)聽通知修改tabbar的樣式
-(void)changeTabbarStyle{
RFTabbarItemsModel *skinTemplate = [RFTabbarItemsModel sharedRFTabbarItemsModel];
if (VIEW_BOUNDS.width == 320) {
//se屏幕
self.tabBar.backgroundImage = [UIImage imageWithContentsOfFile:skinTemplate.tabbarBgImage320Path];
}else if (VIEW_BOUNDS.width == 375){
//iphone6屏幕
self.tabBar.backgroundImage = [UIImage imageWithContentsOfFile:skinTemplate.tabbarBgImage375Path];
}else{
self.tabBar.backgroundImage = [UIImage imageWithContentsOfFile:skinTemplate.tabbarBgImage540Path];
}
self.tabBar.tintColor = [UIColor colorWithRed:skinTemplate.tabbarSelectColorR green:skinTemplate.tabbarSelectColorG blue:skinTemplate.tabbarSelectColorB alpha:1];
self.yunkongzhiItem.image = [[UIImage imageWithContentsOfFile:skinTemplate.kuControlUnselectImagePath] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.yunkongzhiItem.selectedImage = [[UIImage imageWithContentsOfFile:skinTemplate.kuControlImagePath] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.yunkongzhiItem.title = skinTemplate.title1;
self.carItem.image = [[UIImage imageWithContentsOfFile:skinTemplate.serviceUnselectImagePath] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.carItem.selectedImage = [[UIImage imageWithContentsOfFile:skinTemplate.serviceImagePath] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.carItem.title = skinTemplate.title2;
self.infoItem.image = [[UIImage imageWithContentsOfFile:skinTemplate.findUnselectImagePath] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.infoItem.selectedImage = [[UIImage imageWithContentsOfFile:skinTemplate.findImagePath] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.infoItem.title = skinTemplate.title3;
self.mineItem.image = [[UIImage imageWithContentsOfFile:skinTemplate.mineUnselectImagePath] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.mineItem.selectedImage = [[UIImage imageWithContentsOfFile:skinTemplate.mineImagePath] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.mineItem.title = skinTemplate.title4;
}