UITabbar中間突出按鈕

屏幕快照 2019-04-29 上午9.36.53.png

我們?cè)趯憈abbar時(shí),有時(shí)會(huì)出現(xiàn)如上圖的要求,中間的item要突出來.
我們要想實(shí)現(xiàn)這個(gè)需求只需要自定義一個(gè)中間突出的item.其余的幾個(gè)就可以完全使用系統(tǒng)創(chuàng)建就可以.
1.首先創(chuàng)建一個(gè)ApplyTabBar繼承自UITabBar
ApplyTabBar.h

#import <UIKit/UIKit.h>

@class ApplyTabBar;

@protocol ApplyTabBarDelegate <NSObject>
@optional
/** 點(diǎn)擊按鈕回調(diào)方法 */
- (void)tabBarPlusBtnClick:(ApplyTabBar *)tabBar;
@end


@interface ApplyTabBar : UITabBar

/** tabbar的協(xié)議方法 */
@property (nonatomic, weak) id<ApplyTabBarDelegate> myDelegate ;

@end

ApplyTabBar.m

#import "ApplyTabBar.h"

@interface ApplyTabBar ()

/** plus按鈕 */
@property (nonatomic, weak) UIButton *plusBtn ;
@property UILabel *titleLabel;
@end

@implementation ApplyTabBar

- (instancetype)initWithFrame:(CGRect)frame{
    if (self=[super initWithFrame:frame]) {

        self.backgroundColor = [UIColor whiteColor];
        UIButton *plusBtn = [[UIButton alloc] init];
        [plusBtn setBackgroundImage:[UIImage imageNamed:@"applyImage"] forState:UIControlStateNormal];
        [plusBtn setBackgroundImage:[UIImage imageNamed:@"applyImage"] forState:UIControlStateHighlighted];

        self.plusBtn = plusBtn;
        [plusBtn addTarget:self action:@selector(plusBtnDidClick) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:plusBtn];

        self.titleLabel = [[UILabel alloc] init];
        self.titleLabel.text = @"申領(lǐng)";
        self.titleLabel.textAlignment = NSTextAlignmentCenter;
        self.titleLabel.font = [UIFont systemFontOfSize:11];
        [self.titleLabel sizeToFit];
        self.titleLabel.textColor = [UIColor grayColor];
        [self addSubview:self.titleLabel];
    }
    return self;
}

- (void)layoutSubviews{
    [super layoutSubviews];
    //系統(tǒng)自帶的按鈕類型是UITabBarButton圣勒,找出這些類型的按鈕饵史,然后重新排布位置阅虫,空出中間的位置

    Class class = NSClassFromString(@"UITabBarButton");
    int btnIndex = 0;
    CGFloat btnHeight = 0;
    for (UIView *btn in self.subviews) {//遍歷tabbar的子控件
        if ([btn isKindOfClass:class]) {//如果是系統(tǒng)的UITabBarButton厦幅,那么就調(diào)整子控件位置矮慕,空出中間位置
            //每一個(gè)按鈕的寬度==tabbar的五分之一(因?yàn)槲疫@里一共五個(gè)item)
            btn.frame = CGRectMake(self.frame.size.width / 5 * btnIndex, btn.frame.origin.y, self.frame.size.width / 5, btn.frame.size.height);
            btnHeight = btn.frame.origin.y;
            btnIndex++;
            //如果是索引是2(從0開始的)填物,直接讓索引++毛萌,目的就是讓消息按鈕的位置向右移動(dòng)损晤,空出來發(fā)布按鈕的位置
            if (btnIndex == 2) {
                btnIndex++;
            }
        }
    }
    self.plusBtn.center = CGPointMake(self.center.x, self.plusBtn.center.y);
    //調(diào)整發(fā)布按鈕的中線點(diǎn)Y值
    self.titleLabel.center = CGPointMake(self.plusBtn.center.x, btnHeight+ 47-self.titleLabel.frame.size.height/2);

    self.plusBtn.center = CGPointMake(self.plusBtn.center.x, 5);
    self.plusBtn.frame = CGRectMake(self.plusBtn.frame.origin.x, self.plusBtn.frame.origin.y, self.titleLabel.frame.origin.y*2-5, self.titleLabel.frame.origin.y*2-5);
    [self bringSubviewToFront:self.plusBtn];

}

//點(diǎn)擊了發(fā)布按鈕
- (void)plusBtnDidClick{
    //如果tabbar的代理實(shí)現(xiàn)了對(duì)應(yīng)的代理方法脆粥,那么就調(diào)用代理的該方法
    if ([self.delegate respondsToSelector:@selector(tabBarPlusBtnClick:)]) {
        [self.myDelegate tabBarPlusBtnClick:self];
    }
}
@end

無論你使用storyboard還是代碼設(shè)置tabbar 我們都需要自定義一個(gè)UITabBarController.用來關(guān)聯(lián)storyboard中UITabBarController或者直接使用自定義UITabBarController來添加中間的突出item
這里一stroyboard為例
1.storyboard創(chuàng)建UITabBarController并添加四個(gè)item


屏幕快照 2019-04-29 上午10.15.30.png

2.關(guān)聯(lián)自定義UITabBarController
3.在viewdidload方法中添加代碼

ApplyTabBar *tabbar = [[ApplyTabBar alloc] init];
    tabbar.myDelegate = self;
    [self setValue:tabbar forKeyPath:@"tabBar"];

到這我們就可以運(yùn)行程序中間的突出item就出來了
后來發(fā)現(xiàn)一個(gè)問題,當(dāng)我們點(diǎn)擊中間突出item超出tabbar高度的地方發(fā)現(xiàn)不會(huì)觸發(fā)我們的點(diǎn)擊方法.
在這我們需要在ApplyTabBar.m中重寫- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法

//重寫hitTest方法砌溺,去監(jiān)聽發(fā)布按鈕的點(diǎn)擊,目的是為了讓凸出的部分點(diǎn)擊也有反應(yīng)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    //我們只需要在tabbar未隱藏時(shí)重寫當(dāng)前方法
    if (self.isHidden == NO) {

        //將當(dāng)前tabbar的觸摸點(diǎn)轉(zhuǎn)換坐標(biāo)系变隔,轉(zhuǎn)換到發(fā)布按鈕的身上规伐,生成一個(gè)新的點(diǎn)
        CGPoint newP = [self convertPoint:point toView:self.plusBtn];

        //判斷是否在添加按鈕上
        if ( [self.plusBtn pointInside:newP withEvent:event]) {
            return self.plusBtn;
        }else{
            return [super hitTest:point withEvent:event];
        }
    }else {
        return [super hitTest:point withEvent:event];
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匣缘,隨后出現(xiàn)的幾起案子猖闪,更是在濱河造成了極大的恐慌,老刑警劉巖肌厨,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件培慌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柑爸,警方通過查閱死者的電腦和手機(jī)吵护,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來表鳍,“玉大人馅而,你說我怎么就攤上這事∑┦ィ” “怎么了瓮恭?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厘熟。 經(jīng)常有香客問我屯蹦,道長(zhǎng),這世上最難降的妖魔是什么绳姨? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任颇玷,我火速辦了婚禮,結(jié)果婚禮上就缆,老公的妹妹穿的比我還像新娘。我一直安慰自己谒亦,他們只是感情好竭宰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布空郊。 她就那樣靜靜地躺著,像睡著了一般切揭。 火紅的嫁衣襯著肌膚如雪狞甚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天廓旬,我揣著相機(jī)與錄音哼审,去河邊找鬼。 笑死孕豹,一個(gè)胖子當(dāng)著我的面吹牛涩盾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播励背,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼春霍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了叶眉?” 一聲冷哼從身側(cè)響起址儒,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衅疙,沒想到半個(gè)月后莲趣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饱溢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年喧伞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片理朋。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡絮识,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗽上,到底是詐尸還是另有隱情次舌,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布兽愤,位于F島的核電站彼念,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浅萧。R本人自食惡果不足惜逐沙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洼畅。 院中可真熱鬧吩案,春花似錦、人聲如沸帝簇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至残揉,卻和暖如春胧后,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抱环。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工壳快, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镇草。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓眶痰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親陶夜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凛驮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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