iOS-TabBar 中間凸起實現(xiàn)的二種思路

1. 防閑魚app

效果圖如下:
xianyu.gif
實現(xiàn)思路:
  • 此時的tabbar的話也是遵循主流梨水,自定義一個繼承自系統(tǒng)UITabbar的LJTabbar规脸,然后用KVC和系統(tǒng)的進行替換耻矮。
  • 中間的凸起按鈕和tabbar內(nèi)部的子控件不是同一類型助隧,中間的按鈕是一個自定義的button。
  • 最后給tabbar弄一個代理,添加一個點擊中間凸起按鈕的代理方法引几,讓LJTabBarController成為它的代理芭毙,實現(xiàn)對應(yīng)代理方法即可實現(xiàn)按鈕點擊。
核心方法:
  • 動態(tài)添加button 后荤西,重新布局子控件代碼
int btnIndex = 0;
    for (UIView *btn in self.subviews) {//遍歷tabbar的子控件
        if ([btn isKindOfClass:class]) {
            btn.lj_width = self.lj_width / 5;
            btn.lj_x = btn.lj_width * btnIndex;
            btnIndex++;
            if (btnIndex == 2) {
                btnIndex++;
            }
        }
    }
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (self.isHidden == NO) {
        //將當(dāng)前tabbar的觸摸點轉(zhuǎn)換坐標(biāo)系澜搅,轉(zhuǎn)換到發(fā)布按鈕的身上,生成一個新的點
        CGPoint newP = [self convertPoint:point toView:self.plusBtn];
        //判斷如果這個新的點是在發(fā)布按鈕身上邪锌,那么處理點擊事件最合適的view就是發(fā)布按鈕
        if ( [self.plusBtn pointInside:newP withEvent:event]) {
            return self.plusBtn;
        }else{//如果點不在發(fā)布按鈕身上勉躺,直接讓系統(tǒng)處理就可以了
            return [super hitTest:point withEvent:event];
        }
    }
    else {//tabbar隱藏了,那么說明已經(jīng)push到其他的頁面了觅丰,這個時候還是讓系統(tǒng)去判斷最合適的view處理就好了
        return [super hitTest:point withEvent:event];
    }
}

2. 防金琉璃app(一款醫(yī)療軟件)

這個實現(xiàn)思路比較推薦饵溅,特色點是“選中對應(yīng) tabbarItem 不僅有動畫效果, 而且tabbar上的按鈕都為tabbarItem , 沒有使用自定義的button舶胀, 點擊順序非常好控制概说, 不需要再次處理中的凸出按鈕的點擊事件了”

效果圖如下:
doctor.gif
實現(xiàn)思路:
  • 此時的tabbar也是一個繼承自系統(tǒng)UITabbar的LJTabbar碧注,用KVC和系統(tǒng)的進行替換,這樣方便為tabbar 增加一個中間按鈕的背景圖片糖赔, 使其凸出來萍丐!代碼如下:
- (void)layoutSubviews{
    [super layoutSubviews];
    Class class = NSClassFromString(@"UITabBarButton");
    int btnIndex = 0;
    for (UIView *btn in self.subviews){
        if ([btn isKindOfClass:class]) {
            if (btnIndex == 2) { // btnIndex == 2 的時候, 為中間按鈕放典, 添加一個背景圖片
                self.imageView.frame = CGRectMake(5, -17, btn.lj_width - 10, btn.lj_height + 17);
                [btn insertSubview:self.imageView atIndex:0];
                self.btn = btn;
            }
            btnIndex++;
        }
    }
}
  • 為了使突出來的按鈕也有點擊事件逝变, 也需要重寫hitTest方法, 但此時要計算轉(zhuǎn)換背景按鈕的坐標(biāo)系奋构, 以便計算出來壳影, 點擊按鈕 的響應(yīng)區(qū)域。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {}
   if (self.isHidden == NO) {
       CGPoint newP = [self convertPoint:point toView:self.imageView];
       //判斷如果這個新的點是在發(fā)布按鈕身上弥臼,那么處理點擊事件最合適的view就是發(fā)布按鈕
       if ( [self.imageView pointInside:newP withEvent:event]) {
           return self.btn;
       }else{ //如果點不在發(fā)布按鈕身上宴咧,直接讓系統(tǒng)處理就可以了
           return [super hitTest:point withEvent:event];
       }
   }
   else {  //tabbar隱藏了,那么說明已經(jīng)push到其他的頁面了径缅,這個時候還是讓系統(tǒng)去判斷最合適的view處理就好了
       return [super hitTest:point withEvent:event];
   }
}
  • 動畫效果的實現(xiàn)掺栅, 是實現(xiàn)TabBarController 的 tabBarController:shouldSelectViewController: 這個代理方法, 并且添加一個選中的item 動態(tài)添加一個動畫組纳猪, 如下代碼:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
    NSInteger index = [tabBarController.childViewControllers indexOfObject:viewController];  // 獲取當(dāng)前選中的控制器位置
    UIButton *tabBarBtn = tabBarController.tabBar.subviews[index+1];
    Class clase = NSClassFromString(@"UITabBarSwappableImageView");
    UIImageView *imageView = nil;  // 獲取對應(yīng)的ImageView氧卧,添加動畫。
    for (UIView *view in tabBarBtn.subviews) {
        if ([view isKindOfClass:clase]) {
            imageView = (UIImageView *)view;
        }
    }
    imageView.animationImages = self.allImages[index];
    imageView.animationRepeatCount = 1;
    imageView.animationDuration = ImageCount * 0.08;
    [imageView startAnimating];
    return YES;
}

這樣就能實現(xiàn)上述的效果了氏堤,選擇對應(yīng)的按鈕沙绝, 有動畫、 選中顏色也有對應(yīng)的色彩鼠锈,tabbar順序也不會更改闪檬。

該Demo項目地址:https://github.com/CandyGentleman/TabBarController
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脚祟,隨后出現(xiàn)的幾起案子谬以,更是在濱河造成了極大的恐慌,老刑警劉巖由桌,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件为黎,死亡現(xiàn)場離奇詭異,居然都是意外死亡行您,警方通過查閱死者的電腦和手機铭乾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娃循,“玉大人炕檩,你說我怎么就攤上這事。” “怎么了笛质?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵泉沾,是天一觀的道長。 經(jīng)常有香客問我妇押,道長跷究,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任敲霍,我火速辦了婚禮俊马,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肩杈。我一直安慰自己柴我,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布扩然。 她就那樣靜靜地躺著艘儒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夫偶。 梳的紋絲不亂的頭發(fā)上彤悔,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音索守,去河邊找鬼。 笑死抑片,一個胖子當(dāng)著我的面吹牛卵佛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敞斋,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼截汪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了植捎?” 一聲冷哼從身側(cè)響起衙解,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焰枢,沒想到半個月后蚓峦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡济锄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年暑椰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荐绝。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡一汽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出低滩,到底是詐尸還是另有隱情召夹,我是刑警寧澤岩喷,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站监憎,受9級特大地震影響纱意,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枫虏,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一妇穴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隶债,春花似錦腾它、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赞警,卻和暖如春妓忍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愧旦。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工世剖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笤虫。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓旁瘫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親琼蚯。 傳聞我的和親對象是個殘疾皇子酬凳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • 好久都沒吃洋蔥了,一年吃洋蔥的數(shù)字可以用手扳出來峦睡,當(dāng)我切開洋蔥的時候翎苫,情不自禁的流淚了,難怪有一首歌叫我要...
    顏健美閱讀 332評論 0 0
  • 女兒終于去學(xué)校了赐俗!允許我長嘆一口氣拉队,太累了。 2天鬧2晚阻逮,把我積攢了一周的正能量全消耗了粱快。2天...
    相信女兒閱讀 507評論 6 3
  • 天突然陰沉了下來,在黃昏的時候,厚重的云層帶著星星點點的雨事哭,仿佛預(yù)示著片刻后會有暴風(fēng)雨的來臨漫雷。 時辰還早,可天色已...
    雲(yún)墨寒閱讀 457評論 4 4
  • 當(dāng)認真做一件事兒的時候會有意外的驚喜降臨鳍咱。
    是芒果味兒的空氣呀閱讀 409評論 0 0