iOS-自定義懸浮TabBar

最近在寫一個需求,自定義TabBar旗们,自定義TabBar一般有兩種方式:

  • ① 創(chuàng)建一個類繼承系統(tǒng)的UITabBar,在layoutSubviews方法中重新調(diào)整按鈕的位置,再通過[self setValue:tabBar forKeyPath:@"tabBar"]方法丰刊,利用KVC設(shè)置TabBar,但是iOS 13后蘋果粑粑不鼓勵使用KVC增拥;
  • ② 創(chuàng)建一個繼承UIView的類YBTabBar啄巧,然后把系統(tǒng)UITabBar上的UITabBarItem移除,然后把YBTabBar加到系統(tǒng)TabBar的位置上掌栅;

鑒于第二種繼承UIView的方式更靈活且我們的tabbar還有一種類似漂浮的效果秩仆,所以這里我選用的是第二種方式,效果如下所示:

image.png

一猾封、TabBar實現(xiàn)
其實就是自定義個UIView澄耍,然后布局5個按鈕,核心代碼如下所示:

- (void)addTabBarButtonNorImageUrl:(NSString *)norImageUrl
                       selImageUrl:(NSString *)selImageUrl
                             title:(NSString *)title {

    // 1.創(chuàng)建按鈕
    YBTabBarButton *tabBarBtn = [[YBTabBarButton alloc] init];
    tabBarBtn.delegate = self;
    [self addSubview:tabBarBtn];
    // 2.設(shè)置數(shù)據(jù)
    [tabBarBtn setTabBarImageUrl:norImageUrl title:title];
    // 3.監(jiān)聽按鈕點擊
    [tabBarBtn addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchDown];
    // 4.將自定義的YBTabBarButton對象
    [self.tabbarBtnArray addObject:tabBarBtn];
    [self.norImageArrM addObject:norImageUrl];
    [self.selImageArrM addObject:selImageUrl];
    // 5.默認選中第0個按鈕
    if (self.tabbarBtnArray.count == 1) {
        [self buttonClick:tabBarBtn];
        [tabBarBtn.iconBtn setSelected:YES];
    }

}


- (void)layoutSubviews {
    [super layoutSubviews];

    // 按鈕的frame數(shù)據(jù)
    CGFloat buttonH = self.frame.size.height;
    CGFloat buttonW = self.frame.size.width / self.tabbarBtnArray.count;
    CGFloat buttonY = 0;
    for (int index = 0; index < self.tabbarBtnArray.count; index++) {
        // 1.取出按鈕
        YBTabBarButton *button = self.tabbarBtnArray[index];
        // 2.設(shè)置按鈕的frame
        CGFloat buttonX = index * buttonW;
        button.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH);
        // 3.綁定tag
        button.tag = index;
    }
}

二晌缘、再自定義一個繼承系統(tǒng)的UITabBarController齐莲,
將系統(tǒng)的UITabBarItem移除,防止重影磷箕,然后將自定義UIView加到UITabBar选酗。核心代碼如下所示:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    // 初始化tabbar
    [self setupTabbar];
    // 初始化所有的子控制器
    [self setupAllChildViewControllers];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // 刪除系統(tǒng)自動生成的UITabBarButton
    for (UIView *child in self.tabBar.subviews) {
        if ([child isKindOfClass:[UIControl class]]) {
            [child removeFromSuperview];
        }
    }
}


- (void)setupTabbar { 
    //配置信息
    YBConfig *config = [YBConfig shareInstance];
    //config.titleFont = 12;
    //config.norTitleColor = [UIColor blackColor];
    //config.selTitleColor = [UIColor cyanColor];
    //config.titleOffset = 5;
    //config.imageOffset = 10;
    //config.imageSize = CGSizeMake(50, 50);
    //config.titleHeight = 12;
    //config.bgImageOffset = 20;
    YBTabBar *customTabBar = [[YBTabBar alloc] initWithFrame:self.tabBar.bounds config:config];
    customTabBar.backgroundColor = [UIColor clearColor];
    CGRect mainFrame = customTabBar.frame;
    mainFrame.size.height = 88;
    customTabBar.frame = mainFrame;
    customTabBar.delegate = self;
    [self.tabBar addSubview:customTabBar];
    [customTabBar bringSubviewToFront:self.tabBar];
    self.customTabBar = customTabBar;
}


/**
 *  監(jiān)聽tabbar按鈕的改變
 *  @param from   原來選中的位置
 *  @param to     最新選中的位置
 */
- (void)ybTabBar:(YBTabBar *)tabBar didSelectedButtonFrom:(NSInteger)from to:(NSInteger)to {
    self.selectedIndex = to;
    NSLog(@"----from:%ld, to:%ld ",from,to);
}

- (void)setupAllChildViewControllers {
    // 1.首頁
    UIViewController *home = [[UIViewController alloc] init];
    home.view.backgroundColor = [UIColor redColor];
    [self setupChildViewController:home title:@"首頁" imageName:@"shouye" selectedImageName:@"shouye_s"];
    
    // 2.消息
    UIViewController *message = [[UIViewController alloc] init];
    message.view.backgroundColor = [UIColor orangeColor];
    [self setupChildViewController:message title:@"消息" imageName:@"quanzi" selectedImageName:@"quanzi_s"];
    
    // 3.首頁
    UIViewController *home1 = [[UIViewController alloc] init];
    home1.view.backgroundColor = [UIColor blueColor];
    [self setupChildViewController:home1 title:@"發(fā)現(xiàn)" imageName:@"shouye" selectedImageName:@"shouye_s"];
    
    // 4.消息
    UIViewController *message1 = [[UIViewController alloc] init];
    message1.view.backgroundColor = [UIColor greenColor];
    [self setupChildViewController:message1 title:@"廣場" imageName:@"quanzi" selectedImageName:@"quanzi_s"];
}

/**
 *  初始化一個子控制器
 *
 *  @param childVc           需要初始化的子控制器
 *  @param title             標(biāo)題
 *  @param imageName         圖標(biāo)
 *  @param selectedImageName 選中的圖標(biāo)
 */
- (void)setupChildViewController:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName {
    // 1.設(shè)置控制器的屬性
    childVc.title = title;
    // 設(shè)置圖標(biāo)
    childVc.tabBarItem.image = [UIImage imageNamed:imageName];
    // 設(shè)置選中的圖標(biāo)
    UIImage *selectedImage = [UIImage imageNamed:selectedImageName];
    childVc.tabBarItem.selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    childVc.tabBarItem.selectedImage = selectedImage;
    
    // 2.包裝一個導(dǎo)航控制器
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:childVc];
    [self addChildViewController:nav];
    
    // 3.添加tabbar內(nèi)部的按鈕
    [self.customTabBar addTabBarButtonNorImageUrl:imageName
                                      selImageUrl:selectedImageName
                                            title:title];

}

Demo下載地址

END!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岳枷,隨后出現(xiàn)的幾起案子芒填,更是在濱河造成了極大的恐慌呜叫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殿衰,死亡現(xiàn)場離奇詭異朱庆,居然都是意外死亡,警方通過查閱死者的電腦和手機播玖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門椎工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜀踏,你說我怎么就攤上這事维蒙。” “怎么了果覆?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵颅痊,是天一觀的道長。 經(jīng)常有香客問我局待,道長斑响,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任钳榨,我火速辦了婚禮舰罚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薛耻。我一直安慰自己营罢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布饼齿。 她就那樣靜靜地躺著饲漾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缕溉。 梳的紋絲不亂的頭發(fā)上考传,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音证鸥,去河邊找鬼僚楞。 笑死,一個胖子當(dāng)著我的面吹牛敌土,可吹牛的內(nèi)容都是我干的镜硕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼返干,長吁一口氣:“原來是場噩夢啊……” “哼兴枯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矩欠,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤财剖,失蹤者是張志新(化名)和其女友劉穎悠夯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躺坟,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡沦补,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咪橙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夕膀。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖美侦,靈堂內(nèi)的尸體忽然破棺而出产舞,到底是詐尸還是另有隱情,我是刑警寧澤菠剩,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布易猫,位于F島的核電站,受9級特大地震影響具壮,放射性物質(zhì)發(fā)生泄漏准颓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一棺妓、第九天 我趴在偏房一處隱蔽的房頂上張望攘已。 院中可真熱鬧,春花似錦怜跑、人聲如沸贯被。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至看幼,卻和暖如春批旺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诵姜。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工汽煮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚唆。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓暇赤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宵凌。 傳聞我的和親對象是個殘疾皇子鞋囊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容