iOS實戰之UITabBarController

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方法)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容