iOS 自定義tabbar調(diào)節(jié)中間按鈕凸起

代碼:參考黑馬明杰的微博項(xiàng)目中的自定義bar捉腥,加入一點(diǎn)自己的思路

一、思路講解

自定義tabbar替換定義的tabbar你画,在自定義tabbar內(nèi)調(diào)節(jié)相關(guān)按鈕的位置及樣式抵碟,調(diào)節(jié)響應(yīng)鏈的點(diǎn)擊方法

二、相關(guān)問(wèn)題解決

1坏匪、自定義tabbar繼承UITabBar在layoutSubviews方法中調(diào)節(jié)中間按鈕的位置拟逮,將位置往上調(diào)節(jié)。
- (void)layoutSubviews
{
#warning [super layoutSubviews] 一定要調(diào)用
    [super layoutSubviews];
    // 1.設(shè)置加號(hào)按鈕的位置
//    self.plusBtn.centerX = self.width * 0.5;
//    self.plusBtn.y = -2;
    // 2.設(shè)置其他tabbarButton的位置和尺寸
//    CGFloat tabbarButtonW = self.width / 5;
    int tabbarButtonIndex = 0;
    for (UIView *child in self.subviews) {
        Class class = NSClassFromString(@"UITabBarButton");
        if ([child isKindOfClass:class]) {
//            // 設(shè)置寬度
//            child.width = tabbarButtonW;
//            // 設(shè)置x
//            child.x = tabbarButtonIndex * tabbarButtonW;
//
//            // 增加索引
            if (tabbarButtonIndex == 2) {
//                [self bringSubviewToFront:child];
                child.height = 55;
                child.y = -6;
            }
            tabbarButtonIndex++;
        }
    }
}
2适滓、分隔線解決

但是分隔線會(huì)在最上層顯示很丑敦迄。解決方法將分隔線隱藏,自己寫(xiě)一個(gè)分隔線加上去凭迹,就不會(huì)擋住凸起的部分罚屋,記得中間的圖標(biāo)不要透明的

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
      
        //設(shè)置背景,去除tabbar的黑線
        [self setShadowImage:[HXBColor imageFromColor:[UIColor clearColor]]];
        [self setBackgroundImage:[HXBColor imageFromColor:[UIColor whiteColor]]];
        
        UIView *lineView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth, 1)];
        lineView.backgroundColor = kLineMainColor;
        [self addSubview:lineView];
        self.alpha = 1;
    }
    return self;
}
3、響應(yīng)鏈解決

突出部分超出了tabbar的范圍點(diǎn)擊上方?jīng)]有效果需要調(diào)節(jié)響應(yīng)鏈方法
根據(jù)范圍自己設(shè)置

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
   BOOL result = [super pointInside:point withEvent:event];
    if (result) {
        return result;
    }
    if (self.plusBtn.x<point.x&&(self.plusBtn.x+self.plusBtn.width)>point.x&&self.plusBtn.y<point.y&&(self.plusBtn.y+self.plusBtn.height)>point.y ) {
        return YES;
    }
    return NO;
}
4嗅绸、使用方法

自定義好tabbar后脾猛,替換原來(lái)的tabbar

   // 2.更換系統(tǒng)自帶的tabbar
    HWTabBar *tabBar = [[HWTabBar alloc] init];
    [self setValue:tabBar forKeyPath:@"tabBar"];

三、示例代碼

@interface HXBTabbarControlle ()<UIAlertViewDelegate>

@property(nonatomic,strong)HXBNavigationController *managerNaviVC;

@end

@implementation HXBTabbarControlle

-(UIStatusBarStyle)preferredStatusBarStyle
{
    self.view.backgroundColor = kBackgroundGrayDefautColor;
    return UIStatusBarStyleLightContent;  //默認(rèn)的值是黑色的
}

+(void)initialize
{
    UITabBarItem *item = [UITabBarItem appearance];
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:kNavBarMainColor,NSFontAttributeName:[UIFont systemFontOfSize:11]} forState:UIControlStateSelected];
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:SHColor(109, 109, 109),NSFontAttributeName:[UIFont systemFontOfSize:11]} forState:UIControlStateNormal];
    
    UITabBar *bar = [UITabBar appearance];
    bar.barTintColor = [UIColor whiteColor];
    
//    HWTabBar *bar = [HWTabBar appearance];
//    bar.barTintColor = [UIColor whiteColor];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
//    HomeVC *home = [HomeVC new];
    [self loginVertify];//登錄驗(yàn)證
    SearchHotelMainVC *home = [SearchHotelMainVC new];
    [self addChildVc:home title:@"預(yù)定" imageName:@"btn_zhu" selectImageName:@"btn_zhu_h"];

    OrderMainVC *order = [OrderMainVC new];
    [self addChildVc:order title:@"訂單" imageName:@"btn_dd" selectImageName:@"btn_dd_h"];
    
    OpenDoorCenterVC *door = [OpenDoorCenterVC new];
    [self addChildVc:door title:@"自助入住" imageName:@"tab_km" selectImageName:@"tab_km_h"];
    
    ManagerServeVC *manager = [ManagerServeVC new];
    [self addChildVc:manager title:@"服務(wù)" imageName:@"tab_fw" selectImageName:@"tab_fw_h"];
    
    MineVC *mine = [MineVC new];
    [self addChildVc:mine title:@"我的" imageName:@"btn-w" selectImageName:@"btn-w_h"];
    
    // 2.更換系統(tǒng)自帶的tabbar
    HWTabBar *tabBar = [[HWTabBar alloc] init];
    [self setValue:tabBar forKeyPath:@"tabBar"];
}


-(void)addChildVc:(UIViewController*)childVC title:(NSString*)title imageName:(NSString*)imageName selectImageName:(NSString*)selectImageName
{
    childVC.title = title;
    childVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:title image:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] selectedImage:[[UIImage imageNamed:selectImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    HXBNavigationController *nav = [[HXBNavigationController alloc] initWithRootViewController:childVC];
    [self addChildViewController:nav];
}

自定義tabbar的代碼

#import <UIKit/UIKit.h>

@class HWTabBar;

#warning 因?yàn)镠WTabBar繼承自UITabBar鱼鸠,所以稱為HWTabBar的代理猛拴,也必須實(shí)現(xiàn)UITabBar的代理協(xié)議
@protocol HWTabBarDelegate <UITabBarDelegate>
@optional
- (void)tabBarDidClickPlusButton:(UIButton *)plusBtn;
@end

@interface HWTabBar : UITabBar
@property (nonatomic, weak) id<HWTabBarDelegate> delegate;
@end
#import "HWTabBar.h"
#import "HXBColor.h"
#import "TabbarButton.h"

@interface HWTabBar()
@property (nonatomic, weak) UIButton *plusBtn;
@end

@implementation HWTabBar

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        //設(shè)置背景,去除tabbar的黑線
        [self setShadowImage:[HXBColor imageFromColor:[UIColor clearColor]]];
        [self setBackgroundImage:[HXBColor imageFromColor:[UIColor whiteColor]]];
        
        UIView *lineView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth, 1)];
        lineView.backgroundColor = kLineMainColor;
        [self addSubview:lineView];
        self.alpha = 1;
    }
    return self;
}
//通知方法
-(void)upDatePlusBtn
{
    self.plusBtn.selected = YES;
}

-(void)dealloc
{
    //移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kNotificationKey object:nil];
}

/**
 *  加號(hào)按鈕點(diǎn)擊
 */
- (void)plusClick
{
    // 通知代理
    if ([self.delegate respondsToSelector:@selector(tabBarDidClickPlusButton:)]) {
        [self.delegate tabBarDidClickPlusButton:self.plusBtn];
    }
}

- (void)layoutSubviews
{
#warning [super layoutSubviews] 一定要調(diào)用
    [super layoutSubviews];
    // 1.設(shè)置加號(hào)按鈕的位置
//    self.plusBtn.centerX = self.width * 0.5;
//    self.plusBtn.y = -2;
    // 2.設(shè)置其他tabbarButton的位置和尺寸
//    CGFloat tabbarButtonW = self.width / 5;
    int tabbarButtonIndex = 0;
    for (UIView *child in self.subviews) {
        Class class = NSClassFromString(@"UITabBarButton");
        if ([child isKindOfClass:class]) {
//            // 設(shè)置寬度
//            child.width = tabbarButtonW;
//            // 設(shè)置x
//            child.x = tabbarButtonIndex * tabbarButtonW;
//
//            // 增加索引
            if (tabbarButtonIndex == 2) {
//                [self bringSubviewToFront:child];
                child.height = 55;
                child.y = -6;
            }
            tabbarButtonIndex++;
        }
    }
}

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
   BOOL result = [super pointInside:point withEvent:event];
    if (result) {
        return result;
    }
    if (self.plusBtn.x<point.x&&(self.plusBtn.x+self.plusBtn.width)>point.x&&self.plusBtn.y<point.y&&(self.plusBtn.y+self.plusBtn.height)>point.y ) {
        return YES;
    }
    return NO;
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瞧柔,隨后出現(xiàn)的幾起案子漆弄,更是在濱河造成了極大的恐慌,老刑警劉巖造锅,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撼唾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哥蔚,警方通過(guò)查閱死者的電腦和手機(jī)倒谷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糙箍,“玉大人渤愁,你說(shuō)我怎么就攤上這事∩詈唬” “怎么了抖格?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵诺苹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我雹拄,道長(zhǎng)收奔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任滓玖,我火速辦了婚禮坪哄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘势篡。我一直安慰自己翩肌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布禁悠。 她就那樣靜靜地躺著念祭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碍侦。 梳的紋絲不亂的頭發(fā)上棒卷,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音祝钢,去河邊找鬼。 笑死若厚,一個(gè)胖子當(dāng)著我的面吹牛拦英,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播测秸,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疤估,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了霎冯?” 一聲冷哼從身側(cè)響起铃拇,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沈撞,沒(méi)想到半個(gè)月后慷荔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缠俺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年显晶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壹士。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磷雇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躏救,到底是詐尸還是另有隱情唯笙,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站崩掘,受9級(jí)特大地震影響七嫌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呢堰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一抄瑟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枉疼,春花似錦皮假、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至航闺,卻和暖如春褪测,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潦刃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工侮措, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乖杠。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓分扎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親胧洒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畏吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,117評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件卫漫、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 1.你看著天空菲饼,才發(fā)現(xiàn)從七歲起陪著你的那個(gè)天空,一直都在你的頭頂列赎。然后宏悦,你最后一次的想,會(huì)不會(huì)云層的上頭包吝,真的有那...
    文藝聯(lián)盟閱讀 308評(píng)論 0 0
  • 現(xiàn)在我已經(jīng)是大二過(guò)了將近一半的人了肛根,該接觸的人也差不多就是這些了,圈子似乎也定了漏策。我奇怪的是自己所在的幾個(gè)圈子都不...
    cgmrv閱讀 332評(píng)論 0 0
  • 1.做個(gè)有道之人储矩,道——門(mén)道、道理褂乍、道德持隧,大道至簡(jiǎn)! 2.用心的人逃片,往往能成事屡拨;執(zhí)著的人,往往有擔(dān)當(dāng)褥实;只要你用心執(zhí)...
    小歸ing閱讀 395評(píng)論 2 2