最近新增加了個需求 要求由網(wǎng)絡(luò)去獲取圖片迁央。然后去替換tabbar里的image垄潮。但是 嘗試了一下梧奢。tabbar的大小 是根據(jù)你圖片的大小去適應(yīng)的蜂怎。圖片越大 tabbaritem越大。
舉個例子:
就會這樣喂饥。消约。
最后冥思苦想。終于得出2種辦法员帮。
1.是在tabbaritem上邊加一層image去遮蓋tabbaritem或粮。因為imageView不會因為圖片的大小去放大。大小是固定的捞高。
2.是自定義tabbar 創(chuàng)建一個view 里邊包含4個自定義按鈕氯材。(按鈕的圖片大小也是會根據(jù)圖片的大小去自適應(yīng)。所以也要重寫uibuutton的rect方法).
1.第一種方法的邏輯硝岗。
首先你需要知道 tabbar里都有什么控件浓体。
遍歷你的tabbar
for (UIView * tabbar in self.tabBarController.tabBar.subviews) {
NSLog(@"%@",[view class]);
for (UIView * view in tabbar.subviews) {
}
}
說明tabbar里一共有倆控件 為uitabbarbutton 私有的類。獲取不到辈讶。我們再進一步的遍歷命浴。
for (UIView * tabbar in self.tabBarController.tabBar.subviews) {
for (UIView * view in tabbar.subviews) {
NSLog(@"%@",[view class]);
}
}
說明tabbar.subviews里邊4個控件。 因為我一共有2個tabbar 所以有2個圖片 2個文字贱除。
所以我們要這里創(chuàng)建圖片然后去覆蓋生闲。
for (UIView * tabbar in self.tabBarController.tabBar.subviews) {
for (UIView * view in tabbar.subviews) {
NSLog(@"%@",[view class]);
//這里就是判斷是否是圖片控件。
if ([view isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {
// 在這里我們就創(chuàng)建圖片了月幌。如上邊所說 uibutton的圖片大小也是由圖片去控制的碍讯。所以我們要創(chuàng)建一個imageView。
UIImageView * subView = [[UIImageView alloc]initWithFrame:view.frame];
subView.image = self.tabbarItemPicArr[self.tabbarCount];
// 在這里你可以加到這個imageView視圖上扯躺∽叫耍或者你可以加在tabbar里。因為加到這里 你方便去取录语。不然的話 你取出來更改圖片的時候 還需要遍歷一次倍啥。如果取出來的話 你還要去給imageview去設(shè)定一個tag值。
[tabbar addSubview:subView];
//這里需要設(shè)定原來的imageView隱藏 不然的話 兩個圖片會重疊澎埠。
view.hidden = YES;
}
}
MARK
后來出現(xiàn)一種小bug 你這里替換的tabbaritem 位置會從0.0開始 就像這樣虽缕。
然后我分別在第一個控制器和自定義tabbar里去便利
都是從0.0開始 所以tabbaritem位置會變。
后來經(jīng)過思考之后得出結(jié)論
因為蘋果默認的控件都是屬于懶加載模式蒲稳。所以不呈現(xiàn)出來前 沒有位置信息氮趋。
只有在第一個控制器villappear之后 才會真正的創(chuàng)建
所以我在villAppear之后才創(chuàng)建imageView來替代tabbar
第二種邏輯。
你需要自定義一個button然后去重寫里邊的rect
從上圖中 我們可以得到 圖片的大小為32.所以我們要把button的imageView固定為32.并且要他縱向排列江耀。
- (CGRect)imageRectForContentRect:(CGRect)contentRect {
CGFloat imageWidth;
imageWidth = 32;
CGRect rect = CGRectMake((CGRectGetWidth(contentRect) - imageWidth)/2 , 1, imageWidth, imageWidth);
return rect;
}
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
CGFloat width = CGRectGetWidth(contentRect);
CGFloat height = CGRectGetHeight(contentRect);
CGRect rect = CGRectMake((self.frame.size.width - width)/2 , 49 - 33, width, height);
return rect;
}
// 防止高亮
- (void)setHighlighted:(BOOL)highlighted{
}
UIView * tabbarView = [[UIView alloc]initWithFrame:self.tabBarController.tabBar.frame];
UIView * lineView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 375, 0.5)];
lineView.backgroundColor = [UIColor blackColor];
[tabbarView addSubview:lineView];
for (NSInteger i = 0; i < self.tabBarController.tabBar.subviews.count; i++) {
SFTabbarButton * btn = [[SFTabbarButton alloc]initWithFrame:CGRectMake(i*375/self.tabBarController.tabBar.subviews.count, 0, 375/self.tabBarController.tabBar.subviews.count, 49)];
[btn setImage:[UIImage imageNamed:@"huoying"] forState:UIControlStateNormal];
[btn setTitle:@"首頁" forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:11];
btn.titleLabel.textAlignment = NSTextAlignmentCenter;
[btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
[tabbarView addSubview:btn];
};
[self.tabBarController.view addSubview:tabbarView];
self.tabBarController.tabBar.hidden = YES;
剩下就是給按鈕設(shè)計點擊事件 跳轉(zhuǎn)了剩胁!~跳轉(zhuǎn)一定要設(shè)置為公共的哦。因為其他的地方會調(diào)用祥国。
就這樣昵观。希望大家多溝通 多交流。~~